【问题标题】:Macro redefinition in C and C++C 和 C++ 中的宏重新定义
【发布时间】:2012-11-14 17:38:42
【问题描述】:

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

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

【问题讨论】:

  • 这对我来说似乎是个坏方法。可能会引起未来开发人员的混淆和可能的错误。
  • @Jonathan Wood 我不想在实际代码中使用它,只是有趣的时刻

标签: c++ c


【解决方案1】:

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


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

【讨论】:

  • 换句话说,除了空格可能例外,右边必须是相同的标记序列。
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多