与 #endif 位于同一行的语句的编译器警告
Compiler warning for statement on same line as #endif
考虑代码:
#include <stdio.h>
int main() {
int a = 4;
#if 1
printf("Hello world\n");
#endif a++;
printf("a is %d\n", a);
}
无意中,语句 a++;
与 #endif
在同一行,因此未被计算。结果,最终输出为:
Hello world
a is 4
在 x86-64 clang 12 上,这被捕获为使用选项 -Wextra-tokens
的警告。参见 here。
我尝试在 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
编译时没有任何警告。是否有可以传递给 MSVC 中检测额外标记的编译器的设置?
编辑添加:
正如用户 Nathan Pierson 的回答,确实是选项 /Za
起作用了。它似乎没有默认打开。我也无法使用 Visual Studio 项目属性对话框找出要设置的选项。然而,您可以手动输入额外的选项:
有编译器警告 C4067。看起来您需要设置标志 /Za
才能将其应用于 #endif
指令。
在 Visual Studio 属性页面中,此标志由 C/C++ 部分的语言子部分中的“禁用语言扩展”设置控制。
考虑代码:
#include <stdio.h>
int main() {
int a = 4;
#if 1
printf("Hello world\n");
#endif a++;
printf("a is %d\n", a);
}
无意中,语句 a++;
与 #endif
在同一行,因此未被计算。结果,最终输出为:
Hello world
a is 4
在 x86-64 clang 12 上,这被捕获为使用选项 -Wextra-tokens
的警告。参见 here。
我尝试在 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
编译时没有任何警告。是否有可以传递给 MSVC 中检测额外标记的编译器的设置?
编辑添加:
正如用户 Nathan Pierson 的回答,确实是选项 /Za
起作用了。它似乎没有默认打开。我也无法使用 Visual Studio 项目属性对话框找出要设置的选项。然而,您可以手动输入额外的选项:
有编译器警告 C4067。看起来您需要设置标志 /Za
才能将其应用于 #endif
指令。
在 Visual Studio 属性页面中,此标志由 C/C++ 部分的语言子部分中的“禁用语言扩展”设置控制。