【发布时间】:2015-09-28 00:10:34
【问题描述】:
我想广泛使用 ##-operator 和 enum 魔法来处理大量类似的访问操作、错误处理和数据流。
如果应用 ## 和 # 预处理器运算符导致 pp-token 无效,则该行为在 C 中未定义。
C90 中通常没有定义 (*) 预处理器操作的顺序(请参阅 The token pasting operator)。现在在某些情况下(在不同的来源,包括 MISRA 委员会和引用的页面中这样说),多个 ##/#-Operators 的顺序会影响未定义行为的发生。但我很难理解这些来源的示例并确定共同规则。
所以我的问题是:
有效 pp-token 的规则是什么?
不同的 C 和 C++ 标准之间有区别吗?
-
我目前的问题:以下所有 2 个操作员订单是否合法?(**)
#define test(A) test_## A ## _THING int test(0001) = 2;
评论:
(*) 我不使用“未定义”,因为这与未定义的行为无关,恕我直言,而是未指定的行为。应用多个## 或# 运算符通常不会使程序出错。显然有一个顺序——我们只是无法预测是哪个——所以这个顺序是未指定的。
(**) 这不是编号的实际应用。但是模式是等价的。
【问题讨论】:
-
这里是 C 预处理器的一个很好的参考:gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html
标签: c++ c c-preprocessor c89