C 和 C++ 中的宏重定义

Macro redefinition in C and C++

本文关键字:定义 C++      更新时间:2023-10-16

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

#define FOO 0
#define FOO 0

ISO/IEC 14882:2011

16.3 宏替换

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

但是这段代码呢?

#define FOO 0
#define FOO FOO
替换

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

这在

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


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