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()
时正确扩展所有出现的位置?这是在标准中定义得很好,还是特定于编译器?
这是默认情况下Compiler Explorer(godbolt.org)如何显示输出的产物。在输出窗格中禁用.LX0
选项,它将显示您期望的输出。
[Compiler Explorer假定输出为汇编并将HelloWorld::
视为未使用的标签,该标签已由.LX0
选项删除。
在第二个示例中,HelloWorld::
未删除,因为它出现在输出中的后面,使得好像使用了“标签”,并且由于.LX0
仅过滤未使用的标签,因此不会删除它。] >
对于MSVC不会发生,因为MSVC的/E
输出未显示在组装窗格中。
通常,如果要查看完整的未经过滤的编译器输出,请取消选中程序集窗格中的所有复选框。 (我不知道是否还有其他无法禁用的处理。)
另请参阅与this Compiler Explorer issue选项有关的演示文稿问题的-E
。