为何带参数宏#define VAR(int) int展开后是int a而非inta?
宏展开疑问:为何
VAR(int)a会展开为int a而非inta? 问题代码
#include <stdio.h> #define VAR(int) int int main() { VAR(int)a = 0; printf("a:%d\n", a); }
问题描述
原本预期该代码会编译报错,认为宏VAR(int)a会被展开为inta,但实际使用GCC 9.4.0编译(gcc test.c -Wall)并运行后无报错,输出结果为:
wu@PC-YLX47FF4:~$ ./a.out a:0
原因解释
这是由C语言预处理器对带参数宏的匹配规则决定的:
- 带参数宏的定义格式要求
宏名和左括号(之间不能有空格,预处理器会以此识别带参数的宏调用。 - 当处理
VAR(int)a时,预处理器只会匹配VAR(int)这部分作为宏调用:把int作为宏参数代入替换文本,得到int;后面的a是独立的标识符,会和宏展开后的int直接拼接,最终形成int a。 - 预处理器不会把
VAR(int)a整体视为宏调用,而是拆分处理宏调用部分和后续的独立标识符,所以不会出现你预期的inta。
如果想要实现类似inta的展开效果,需要将宏改为不带参数的形式(比如#define VAR int),再写VARint a,但这属于不符合编码规范的写法,没有实际意义。
内容的提问来源于stack exchange,提问作者user27649842
相关产品推荐
相关产品推荐

