VS2013忽略编译指示警告禁用

时间:2015-04-09 00:38:16

标签: c++ visual-studio-2013 c-preprocessor pragma preprocessor-directive

int main() {
#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
#pragma warning(pop)
}

###########################或################ ###########

int main() {
#pragma warning(suppress: 4101)
    int i;
}

我相信其中任何一个都应该在Visual Studio 2013上进行编译,警告被视为错误,没有C4101警告(关于我是一个未引用的局部变量。)这是一个4级警告。

但是,它仍在给我警告。即使我关闭被视为错误的警告,它仍然会给我警告,尽管它会编译因为没有错误。

我没有使用预编译的头文件/ stdafx.h。我看到其他一些问题,说这个pragma技术可以解决实际代码(也许它们意味着代码在头文件中,但没有指定或看起来像那样)。其他一些人在stdafx.h被忽略之前含糊地说没有解释任何#pragma命令。但是' https://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.120).aspx'具体提到pragma可以在源代码中覆盖编译器选项。当然,我从来没有使用过stdafx.h,更像是一个unix家伙,所以也许还有一些我完全缺失的东西。

我尝试过指定C4101而不仅仅是4101,而且它无法在那里处理alpha。我已尝试指定#pragma警告(推送2),即使这会触及我不想做的所有3级和4级警告 - 即使这仍然会给出4级警告。

这是我的编译器命令行选项:/MP /GS /W4 /Zc:wchar_t /Zi /Gm- /Od /sdl /Fd"<...>\pragmaWarning\Intermediate\vc120.pdb" /fp:precise /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MDd /Fa"<...>\pragmaWarning\Intermediate\" /EHsc /nologo /Fo"<...>\pragmaWarning\Intermediate\" /Fp"<...>\pragmaWarning\Intermediate\pragmaWarning.pch"

正如您所看到的,这些命令行选项会忽略被视为错误的警告。

2 个答案:

答案 0 :(得分:8)

有些警告的功能范围是&#39;并且无法使用#pragma warning(suppress: 4101)进行抑制。正如您所指出的那样,它们也不能通过围绕特定行进行禁用。您必须为整个功能禁用此警告:

#pragma warning(push)
#pragma warning(disable: 4101)
int main() {
    int i;
}
#pragma warning(pop)

另请注意,对于特定于行而非范围的警告,#pragma warning(suppress: xxx)的使用特定于文件中的下一个实际行。

答案 1 :(得分:0)

我同意,#pragma warning(suppress: 4101)应该这样做。

问:为什么不试试#pragma warning(disable: 4101)

或者

#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
    ... more code ...
#pragma warning(pop)

以下是Microsoft文档:

https://msdn.microsoft.com/en-us/library/2c8f766e.aspx