5

我知道这段代码在 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

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

4

1 回答 1

6

这在 C 或 C++ 中都是不允许的。替换列表必须相同。您所说的(在第一遍之后)是处理替换列表1的结果,而不是替换列表本身。由于替换列表本身并不相同,因此不允许使用该代码。


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

于 2012-11-14T17:42:22.177 回答