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

时间:2015-09-07 04:17:02

标签: c macros c-preprocessor

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

#define a 2  
#define a 3   

我认为代码中a的任何出现都会被2取代,遇到#define a 3时,代码中不再有a个由3替换,因此2优先。

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

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