嵌入式与Linux那些事

电子技术应用专栏作家——嵌入式与Linux那些事。关注嵌入式与Linux的校招社招,本人整理了《嵌入式软件工程师笔试面试指南》PDF,平时发布嵌入式与Linux相关的实用技术文章

C语言宏嵌套的展开规则

0
阅读(1724)

嵌入式 C 语言中,宏是在预编译时用宏体内容“文本替换”代码中的宏名的。

1、先讲一些宏嵌套的展开规则

1、一般的展开规律像函数的参数一样:先展开参数,再分析函数,即由内向外展开。

2、当宏中有#运算符的时候,不展开参数。

3、当宏中有##运算符的时候,先展开函数,再分析参数。

4、##运算符用于将参数连接到一起,预处理过程把出现在##运算符两侧的参数合并成一个符号,注意不是字符串。

2、“#”和“##”的使用规则

“#” 是将宏参数转换为字符串。不管该参数宏什么,即“原貌”用字符串显示出来。即将宏参数用双引号“”包裹起来形成一个字符串。例如:

image.png


“##” 被称为连接符(concatenation),把宏参数与之前的token(参数/字符串空格等)连接起来。例如:

image.png


   2、宏的常见展开错误

image.png


解决办法:

1、在宏定义中,将参数加上括号,这样在替换时保证括号内的表达式优先运算。

2、利用括号将整个宏定义的内容括起来,保证整个宏定义中的表达式优先运算。


宏嵌套


宏嵌套是宏使用的难点,也是易错点。下面我将宏嵌套的展开规则用流程图来说明一下:

image.png

宏嵌套的展开规则流程图


注意:上图中的 2 和 3 是条件或,只要满足一个条件就会进入流程5。

下面举例说明:

image.png


上例中两个嵌套宏的展开流程如下:

image.png


上例中嵌套宏的展开流程如下:

image.png

注意:嵌套宏的展开规则与编译器有关,不同的编译器可能对同一个嵌套宏展开不同。

以上测试都是在 VS2010(x86)上