与 #endif 位于同一行的语句的编译器警告

Try*_*yer 6 c++ visual-studio visual-c++

考虑代码:

#include <stdio.h>

int main() {
    int a = 4;
#if 1
    printf("Hello world\n");
#endif a++;
    printf("a is %d\n", a);
}
Run Code Online (Sandbox Code Playgroud)

不经意间,statementa++;与 a 位于同一行,#endif并且不被求值。结果,最终的输出是:

Hello world
a is 4
Run Code Online (Sandbox Code Playgroud)

在 x86-64 clang 12 上,这是使用 using option 捕获的警告-Wextra-tokens。看这里

我尝试在 Visual Studio 2019 MSVC 上使用命令行选项进行编译:

/JMC /permissive- /ifcOutput "Debug\" /GS /analyze- /W3 /Zc:wchar_t /I"../include/" /ZI /Gm- /Od /sdl /Fd"Debug\vc142.pdb" /Zc:inline /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /FC /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\windows.pch" /diagnostics:column 
Run Code Online (Sandbox Code Playgroud)

编译时没有任何类型的警告。是否有一个设置可以传递给 MSVC 中的编译器来检测额外的标记?


编辑添加:

正如用户Nathan Pierson所回答的,这确实是一个/Za有效的选项。默认情况下似乎没有开启。我也无法使用 Visual Studio 项目属性对话框来查找要设置的选项。然而,人们可以手动输入额外的选项,如下所示:

在此输入图像描述


/ZaETA:不建议使用

Nat*_*son 5

有编译器警告C4067。看起来您需要设置标志/Za才能将其应用于#endif指令。

在 Visual Studio 属性页中,此标志由 C/C++ 部分的语言子部分中的设置“禁用语言扩展”控制。