是什么原因导致使用包含冒号的函数式宏时编译器出现差异?

问题描述 投票:5回答:1

A()宏只会在MSVC上扩展,而不会在GCC / Clang上扩展,除非A()带有前缀,例如Test A()

通过在-E/E)标志(godbolt.org)下运行以下代码段:

#define A() HelloWorld::
#define B() ::

A()
B()

我们看到MSVC提供以下输出:

HelloWorld::
::

并且GCC / Clang提供了不同的输出:

::

但随后运行此代码段:

#define A() HelloWorld::

A()
Test A()

为我们提供了所有3种编译器的以下内容:

HelloWorld::
Test HelloWorld::

为什么GCC / Clang输出缺少第一行?为何在写入Test A()时正确扩展所有出现的位置?这是在标准中定义得很好,还是特定于编译器?

c++ gcc visual-c++ clang precompile
1个回答
9
投票

这是默认情况下Compiler Explorer(godbolt.org)如何显示输出的产物。在输出窗格中禁用.LX0选项,它将显示您期望的输出。

[Compiler Explorer假定输出为汇编并将HelloWorld::视为未使用的标签,该标签已由.LX0选项删除。

在第二个示例中,HelloWorld::未删除,因为它出现在输出中的后面,使得好像使用了“标签”,并且由于.LX0仅过滤未使用的标签,因此不会删除它。] >

对于MSVC不会发生,因为MSVC的/E输出未显示在组装窗格中。

通常,如果要查看完整的未经过滤的编译器输出,请取消选中程序集窗格中的所有复选框。 (我不知道是否还有其他无法禁用的处理。)

另请参阅与this Compiler Explorer issue选项有关的演示文稿问题的-E

© www.soinside.com 2019 - 2024. All rights reserved.