GCC中宏X引用后置定义的TEST仍能正常展开的原因咨询
问题:宏X引用后续定义的TEST,为何仍能正确展开?
相关代码
foo.h
//foo.h #define X TEST-9 #define TEST 10
foo.c
//foo.c #include<stdio.h> #include"foo.h" int main(void) { int a = X; printf("%d\n", a); }
编译与运行过程
- 执行编译命令:
gcc -o foo foo.c -Wall -Wextra
编译无输出(说明编译成功)
- 运行程序:
./foo
运行结果:1
问题解答
这事儿的关键在于C语言宏的展开机制——宏定义只是记录替换规则,不是当场就把内容计算好,具体的替换是在宏被实际使用的时候才触发的:
- 当预处理器读到
#define X TEST-9时,不会去管TEST此时有没有定义,只是把X对应的替换内容原封不动存成TEST-9。 - 等到编译到
int a = X;这一行,预处理器才会把X展开成TEST-9,这时候#define TEST 10已经被处理过了,所以紧接着又把TEST替换成10,最终得到10-9,运行时计算结果就是1。
内容的提问来源于stack exchange,提问作者Kid
相关产品推荐
相关产品推荐

