宏扩展忽略了 MSVC 中的一些标记

Kir*_*riy 3 c++ macros visual-c++

我在 msvc 编译器中遇到宏扩展问题。我希望以下代码能够扩展为F x,它在 gcc 和 clang 上执行此操作。但 msvc 将其扩展为仅F忽略x令牌。这里发生了什么?

#define S(s) s
#define F()

#define M() S(S(F) x)

M() // expands to 'F' on msvc
Run Code Online (Sandbox Code Playgroud)

但是,如果没有定义,F()它也会像预期的那样扩展到F xmsvc 上。

#define S(s) s
// #define F()

#define M() S(S(F) x)

M() // expands to 'F x' on msvc
Run Code Online (Sandbox Code Playgroud)

我正在使用编译器资源管理器站点来检查此代码。编译器版本是x64 msvc v19.latest。

Hol*_*Cat 7

用于/Zc:preprocessor切换到新的、符合标准的预处理器。它的行为如您所期望的那样。