【C语言】预处理超级详细解析
admin
2024-03-30 05:45:32
0

前言:

作者简介:爱吃大白菜1132

人生格言:纸上得来终觉浅,绝知此事要躬行

 

如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步!

 

如果觉得博主文章还不错的话,希望三连支持!

目录

 

1.预处理符号

2.#define

#define 定义标识符 

#define 定义宏

#define 替换规则 

3.宏定义中的#和##号的区别 

#的作用

##的作用

4.条件编译


1.预处理符号

__FILE__      //进行编译的源文件
__LINE__      //文件当前的行号
__DATE__      //文件被编译的日期
__TIME__      //文件被编译的时间
__STDC__      //如果编译器遵循ANSI C,其值为1,否则未定义

以上预定义符号都是C语言内置的。

2.#define

#define 定义标识符 

语法:#define name stuff

例如:

#include 
#define MAX 10int main()
{printf("%d\n", MAX);//打印10return 0;
}

#define 定义宏

语法:#define name( parament-list ) stuff

注:

         参数列表的左括号必须与name紧邻。

         如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。

#include 
#define SUM(a,b) (a)+(b)int main()
{printf("%d\n", SUM(2, 3));return 0;
}

 注:

        由于宏是通过替换完成的,所以操作符的优先级会影响宏的求值,应该尽量使用括号明确优先级。

#define 替换规则 

在程序中扩展#define定义符号和宏时,需要涉及几个步骤。

        1. 在调用宏时,首先对宏中参数进行检查,检查是否包含任何由#define定义的符号。如果有,它们首先被替换。

        2. 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。

        3. 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果有,就重复上述处理过程。

3.宏定义中的#和##号的区别 

#的作用

        加上#后进入宏定义,在预处理时,不会将其改变成参数,而是保留参数所对应的字符串。

#include #define PRINT( VALUE,FORMAT) printf("the value of  "#VALUE" is " FORMAT "\n", VALUE);
int main()
{int a = 3;PRINT(a,"%d");//预处理会替换为://printf("the value of  a is %d\n", a);
}

##的作用

##可以把位于它两边的符号合成一个符号。

它允许宏定义从分离的文本片段创建标识符。

//FUC将c和h粘合到一起,相当于字符名ch
#include #define FUC(A,B) A##Bint main()
{char ch[] = "hello world";printf("%s\n", FUC(c,h) );
}

4.条件编译

常见的条件编译指令:

1.#if 常量表达式//...#endif//常量表达式由预处理器求值。如:#define __DEBUG__ 1#if __DEBUG__//..#endif
2.多个分支的条件编译#if 常量表达式//...#elif 常量表达式//...#else//...#endif
3.判断是否被定义#if defined(symbol)#ifdef symbol#if !defined(symbol)#ifndef symbol
4.嵌套指令#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif#endif

相关内容

热门资讯

郑州拟调整公积金贷款年龄上限 4月23日消息,郑州住房公积金管理中心发布通告,就调整住房公积金个人住房贷款借款人年龄上限向社会公开...
华勤技术:一季度归母净利润8.... 4月23日消息,华勤技术公告,2025年第一季度实现营业收入349.98亿元,同比增长115.65%...
生态环境部:我国核电规模全球第... 4月23日消息,在今日举行的例行新闻发布会上,生态环境部有关负责人介绍,我国的核电规模已成为世界第一...
汇丰研究:港元短期内或触7.7... 4月23日消息,汇丰环球研究就港元发表报告,认为未来美元兑港元短期内可能面临额外的下行压力(即港元迈...
上期所:调整黄金期货品种相关合... 4月23日消息,上期所公告,经研究决定,自2025年4月25日交易(即4月24日晚夜盘)起:黄金期货...
九安医疗:美国加税给公司造成的... 4月23日消息,有投资者向九安医疗提问:美国加税对公司影响大吗?九安医疗在互动平台回复称,公司正在密...
欧元区4月制造业PMI初值为4... 4月23日消息,欧元区4月制造业PMI初值为48.7,预期47.5,前值48.6;4月服务业PMI初...
印尼央行:在国内现货、非交叉盘... 4月23日消息,印尼央行行长表示,将继续有节制地在离岸非交叉盘(NDF)市场进行干预,在国内现货、非...
足金饰品一夜下跌27元每克 4月23日消息,受国际金价下跌影响,国内金店足金饰品价格23日开始回调。其中,周大福、周六福足金饰品...
中证转债指数午盘涨0.28% 4月23日消息,中证转债指数午盘涨0.28%,34只可转债涨幅超2%,“N鼎龙转”涨30%盘中临停,...