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

Ann*_*562 3 c macros c-preprocessor

我按如下方式定义了两次宏:

#define a 2  
#define a 3   
Run Code Online (Sandbox Code Playgroud)

我认为a代码中的任何出现都会被替换为2,并且当#define a 3遇到时,代码中没有更多的as可供替换3,因此2优先.

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

ric*_*ici 7

如果你像这样定义一次宏,编译器至少应该给你警告,如果不是错误的话.这是一个错误.

§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 */
...
Run Code Online (Sandbox Code Playgroud)

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

§6.10/ 7:除非另有说明,否则预处理指令中的预处理令牌不受宏扩展的影响.

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


R S*_*ahu 5

我不清楚你期待看到什么.

第二行覆盖第一行的定义a.

a之后遇到的任何事都将被替换3.


Sag*_*ain 5

a不会被2 in替换,#define a 3因为这也是一个预处理器。

处理后#define a 2,的值为a2,但下一条语句将其覆盖#define a 3