VS2013 忽略编译指示警告禁用

Posted

技术标签:

【中文标题】VS2013 忽略编译指示警告禁用【英文标题】:VS2013 ignoring pragma warning disable 【发布时间】:2015-04-09 00:38:16 【问题描述】:
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。我看到其他一些问题说这种编译指示技术可以解决实际代码(也许他们的意思是标题中的代码,但没有指定或看起来像那样)。其他一些人在没有解释的情况下含糊地说 stdafx.h 之前的任何#pragma 命令都将被忽略。但是 'https://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.120).aspx' 特别提到 pragma 可以在源代码中覆盖编译器选项。诚然,我从来没有使用过 stdafx.h,因为我更像是一个 unix 人,所以也许我完全缺少一些完全基本的东西。

我尝试指定 C4101 而不是仅指定 4101,但它无法处理其中的 alpha。我已经尝试指定#pragma warning(push 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"

如您所见,这些命令行选项忽略了被视为错误的警告。

【问题讨论】:

警告编译指示可能是函数范围的,这意味着它适用于后续的函数,而不是声明。也许吧。 整个 stdafx 的事情与你的问题无关,不用担心。 而且,是的,我可以删除未引用的局部变量。而且,是的,我可以有一行:“i;”或者有一个未使用的_variable 宏来做同样的事情。而且,是的,我可以禁用整个项目的特定警告。但是,我更多的是为那些您明确想要关闭特定行的警告但其他所有内容都打开的罕见且少数情况的解决方案。 一些警告的范围是函数而不是代码行,C4101 就是其中之一。您需要在功能范围之外禁用它。请注意,抑制仅适用于文件中的下一个 physical 行。 查克明白了!如果我在函数之前移动 push & disable 并在函数之后 pop ,它工作正常。而且,使用只是抑制不起作用,就像你说的只是下一条物理线。如何判断警告的范围是函数、代码行还是其他内容? 'msdn.microsoft.com/en-us/library/c733d5h9.aspx'(VS2013 C4101 上的文档)没有指定。 【参考方案1】:

一些警告是“功能范围”,不能通过使用#pragma warning(suppress: 4101) 来抑制。正如您所指出的,它们也不能通过仅在特定行周围执行来禁用。您必须为整个功能禁用此警告:

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

#pragma warning(pop)

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

【讨论】:

【参考方案2】:

我同意,#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

【讨论】:

抱歉,我尝试过的原始帖子中有两个代码块,我可能可以更好地分开。我去把分离弄得更清楚。其中一个与此相同,仍然导致警告。

以上是关于VS2013 忽略编译指示警告禁用的主要内容,如果未能解决你的问题,请参考以下文章

关闭vs警告

如何为VS2013中的所有项目设置编译器警告级别?

VS2008 C ++警告LNK4229:无效指令

在 Qt Creator 中禁用编译器警告项目范围(使用 MSVC 时)

Visual Studio 禁用特定目录中文件的警告

禁用 VS 代码中的警告