我定义了一个宏两次,如下所示:
#define a 2
#define a 3
我认为任何发生a
代码中将替换为2
, 什么时候#define a 3
遇到了就没有了a
代码中的 s 可以替换为3
, 所以2
将优先。
但是当我执行它的时候a
被替换为3,为什么?
如果你像这样定义一个宏两次,编译器至少应该给你警告,如果不是错误的话。这是一个错误。
§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 */
...
宏替换在读取文件时发生,使用文件中该点处活动的宏定义,except(大多数)预处理指令内部。
§6.10/7:除非另有说明,预处理指令中的预处理标记不受宏扩展的影响。
§6.10.3.5/1:宏定义持续(独立于块结构)直到相应的#undef
遇到指令或(如果没有遇到)直到预处理翻译单元结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)