嵌套宏定义会产生什么结果?示例代码中变量a最终取值为1还是11?
宏嵌套递归替换的行为与变量取值分析
结论
变量a的最终取值是11。
原因分析
C预处理器的宏替换是纯文本替换,但内置递归防护机制:在宏替换链中,若检测到会导致无限递归的宏引用,会停止继续展开。
针对你给出的代码:
#define a aa #define aa a int main() { int a = 1; int aa = 11; }
预处理阶段的具体替换过程:
处理
int a = 1;:- 首先,宏
a被替换为aa; - 接着,
aa作为已定义的宏,会被替换为a; - 预处理器检测到继续替换
a会回到初始宏,触发递归,因此停止展开,最终这条语句变为int aa = 1;。
- 首先,宏
处理
int aa = 11;:- 首先,宏
aa被替换为a; - 接着,
a作为已定义的宏,会被替换为aa; - 同样触发递归检测,停止展开,最终这条语句变为
int a = 11;。
- 首先,宏
编译后的代码等价于:
int main() { int aa = 1; int a = 11; }
因此变量a的取值为11。
内容的提问来源于stack exchange,提问作者LZB
相关产品推荐
相关产品推荐

