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

Fro*_*art 5 c c++

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

#define FOO 0
#define FOO 0
Run Code Online (Sandbox Code Playgroud)

ISO/IEC 14882:2011

16.3宏替换[cpp.replace]

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

但是这段代码怎么样?

#define FOO 0
#define FOO FOO
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 6

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


1或者至少如果预处理器以特定的方式工作,那么结果会与实际的方式不同.