我按如下方式定义了两次宏:
#define a 2
#define a 3
我认为代码中a
的任何出现都会被2
取代,遇到#define a 3
时,代码中不再有a
个由3
替换,因此2
优先。
但是当我执行它a
被3替换时,为什么?
答案 0 :(得分:6)
如果你像这样定义一次宏,编译器至少应该给你警告,如果不是错误的话。这是一个错误。
§6.10.3/ 2:当前定义为类似对象宏的标识符不应由另一个
#define
预处理指令重新定义,除非第二个定义是类似于对象的宏定义,并且两个替换列表是相同。
您可以通过明确删除以前的定义来重新定义宏:
#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:宏定义持续(独立于块结构),直到遇到相应的
#undef
指令或(如果没有遇到)指令,直到预处理转换单元结束。
答案 1 :(得分:5)
我不清楚你期待看到什么。
第二行会覆盖第一行a
的定义。
之后遇到的任何a
都会被3
替换。
答案 2 :(得分:3)
a
不会被#define a 3
中的2替换,因为这也是预处理器。
处理#define a 2
后,a
的值为2,但会被下一个语句覆盖#define a 3