【发布时间】:2015-07-15 14:22:33
【问题描述】:
谁能解释一下为什么有 2 个连接运算符不会导致预处理器产生任何错误?:
#define Z(x) x ## ## 3
Z(3)
结果:
33
标准是这样说的:
...替换列表中 ## 预处理标记的每个实例 (不是来自参数)被删除并且前面的预处理 令牌与以下预处理令牌连接
所以我希望预处理器首先尝试将x 与第二个## 连接起来,这看起来很奇怪。这不会产生任何有效的令牌,所以我希望至少有一个警告。 gcc 和 VC 都不会产生任何警告。
我希望能对它的工作原理和原因进行一些解释。
标准提到了placemaker 临时标记,这可以解释为什么它有效,但是在两个“双锐”之间必须有一个这样的标记。问题是placemaker在参数不包含token且两个concat操作符之间没有参数时会生成token。
【问题讨论】:
-
@cpplearner:谢谢 - 这是我对 gcc、vc 的期望。
标签: c++ c c-preprocessor