我正在努力理解C++标准的预处理要求。我创建的一个有点棘手的例子在GCC和VC++2010中得到了令人惊讶的结果:
#define a(x,y) x##y
#define tzsW kka
a(t,zs )WGCC产量:
tzs W注意W之前添加的额外空间。
VC++2010产量:
tzsW注在W之前没有添加空格,但是标识符没有进一步展开。我扫描了C++03标准,找不到任何东西说我们应该阻止创建一个新的标识符(tzsW),就像gcc一样。任何事情都不能阻止这个新的标识符进一步扩展(VC++行为)。
为什么GCC和VC++2010不喜欢新的标识符?
编辑
如果使用了另一个宏调用,例如
a(t,zs )[]gcc产量:
tzs[]请注意,没有添加任何空格,显示gcc故意为我以前的案例添加空间。
发布于 2014-04-02 09:36:04
预处理程序的输出是令牌,而不是纯文本。除非使用令牌粘贴运算符,否则通常不会在预处理中组合令牌。
当您查看预处理步骤的输出时,必须将标记转换为文本。gcc插入了这个空间,这样你就不会误以为tzsW是一个单一的标记。在tzs[情况下,它不需要这样做,因为[不是一个有效的标识符,所以没有混淆。
这两个编译器都正确地不将tzsW视为要重新展开的单个令牌。
请注意,可视化C++文档承认,与编译原始源相比,编译预处理程序的输出可能会产生不同且不正确的输出,因为在将预处理输出转换为文本时,它们不会插入空格来分隔令牌。在正常操作中,当预处理器输出直接传递到编译器的下一阶段时,不会发生这种情况。
发布于 2014-04-02 09:35:22
kka代替kka?
见标准16.3.4:
替换列表中的所有参数被替换后,生成的预处理令牌序列将与源文件的所有后续预处理令牌重新包装,以便替换更多的宏名称。这表明VC的行为在这里是不正确的。
https://stackoverflow.com/questions/22806882
复制相似问题