我定义了两次宏,如下所示:
#define a 2
#define a 3
我认为代码中任何出现的a
都会被2
替换,当遇到#定义3
时,代码中没有更多的a
可以被3
替换,所以2
将优先。
但是当我执行它时a
被替换为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
。