我知道这段代码在 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
替换列表在预处理开始时并不相同(仅在第一次替换发生时)。