提问者:小点点

当C预处理器宏定义两次时会发生什么?


我定义了两次宏,如下所示:

#define a 2  
#define a 3   

我认为代码中任何出现的a都会被2替换,当遇到#定义3时,代码中没有更多的a可以被3替换,所以2将优先。

但是当我执行它时a被替换为3,为什么?


共3个答案

匿名用户

如果您这样定义了两次宏,编译器至少应该给您警告,如果不是错误的话。这是一个错误。

§6.10.3/2:当前定义为类对象宏的标识符不应被另一个#定义预处理指令重新定义,除非第二个定义是类对象宏定义并且两个替换列表相同。

您可以通过显式删除先前的定义来重新定义宏:

#define a 2
/* In this part of the code, a will be replaced with 2 */
...

#undef a
#define a 3
/* From here on, a will be replaced with 3 */
...

宏替换发生在读取文件时,使用文件中该点活动的宏定义,除了(大多数)预处理指令内部。

§6.10/7:除非另有说明,否则预处理指令中的预处理标记不受宏扩展的约束。

§6.10.3.5/1:宏定义持续(独立于块结构),直到遇到相应的#underf指令,或者(如果没有遇到)直到预处理翻译单元结束。

匿名用户

a不会被中的2替换#定义一个3,因为这也是一个预处理器。

处理#定义一个2后,a的值为2,但被下一条语句#定义一个3覆盖

匿名用户

我不清楚你想看到什么。

第二行覆盖了第一行中a的定义。

之后遇到的任何a都将替换为3

相关问题