C和C ++中的宏重新定义

时间:2012-11-14 17:38:42

标签: c++ c

我知道这段代码在C和C ++中都有效:

#define FOO 0
#define FOO 0

ISO / IEC 14882:2011

  

16.3宏替换[cpp.replace]

     

2当前定义为类似对象的宏的标识符可以是   由另一个#define预处理指令重新定义,提供了   第二个定义是一个类似于对象的宏定义和两个   替换列表是相同的,否则程序是不正确的。   同样,当前定义为类似函数的宏的标识符可以   由另一个#define预处理指令重新定义   第二个定义是类似函数的宏定义,具有   相同数量和参数的拼写,以及两个替换列表   是相同的,否则该程序是不正确的。

但这段代码怎么样?

#define FOO 0
#define FOO FOO

替换列表在预处理开始时不相同(仅在第一次替换发生时)。

1 个答案:

答案 0 :(得分:6)

C或C ++中不允许这样做。替换列表必须相同。您所谈论的(第一次通过之后)是处理替换列表 1 的结果,而不是替换列表本身。由于替换列表本身不相同,因此不允许使用该代码。


1 或者至少如果预处理器以特定的方式工作,结果与实际情况有所不同,结果会是什么。