gpt4 book ai didi

c++ - GCC 和 VC++ 预处理器的意外行为

转载 作者:行者123 更新时间:2023-11-30 01:18:18 27 4
gpt4 key购买 nike

我正在尝试了解 C++ 标准预处理器要求。我创建的一个有点棘手的示例在 GCC 和 VC++2010 中产生了令人惊讶的结果:

#define a(x,y) x##y
#define tzsW kka
a(t,zs )W

海湾合作委员会产量:

tzs W

注意 W 之前添加的额外空格。

VC++2010 产量:

tzsW

请注意,W 之前没有添加空格,但标识符没有进一步扩展。我浏览了 C++03 标准,没有找到任何说明我们应该像在 gcc 中一样阻止创建新标识符 (tzsW) 的内容。并没有阻止这个新标识符进一步扩展宏(VC++ 行为)。

为什么 GCC 和 VC++2010 不喜欢新标识符?

编辑

如果使用另一个宏调用,例如

a(t,zs  )[]

gcc 产量:

tzs[]

注意没有添加空格,表明 gcc 故意在我之前的案例中添加了空格。

最佳答案

预处理器的输出是标记,而不是纯文本。除非您使用标记粘贴运算符,否则标记通常不会在预处理中组合。

当您查看预处理步骤的输出时,您必须将标记转换为文本。 gcc 插入空格,这样您就不会误以为 tzsW 是单个标记。它不需要在 tzs[ 情况下执行此操作,因为 [ 不是有效的标识符字符,因此不会造成混淆。

两个编译器都没有将 tzsW 视为要重新扩展的单个标记,这都是正确的。

请注意 Visual C++ documentation承认与编译原始源相比,编译预处理器的输出可能会产生不同且不正确的输出,因为它们在将预处理输出转换为文本时不会插入空格来分隔标记。当预处理器输出在正常操作中直接传递到编译器的下一阶段时,不会发生这种情况。

关于c++ - GCC 和 VC++ 预处理器的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22806882/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com