C++ VS2013忽略pragma警告禁用

C++ VS2013忽略pragma警告禁用,c++,visual-studio-2013,c-preprocessor,pragma,preprocessor-directive,C++,Visual Studio 2013,C Preprocessor,Pragma,Preprocessor Directive,《强刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支#########

《强刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支##############

int main() {
#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
#pragma warning(pop)
}
我认为这两个变量中的任何一个都应该在Visual Studio 2013上编译,警告被视为错误,没有C4101警告(关于I是未引用的局部变量)。这是4级警告

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

我没有使用预编译头/stdafx.h。我还看到一些其他问题,说这个pragma技术可以围绕实际代码工作(也许它们指的是头中的代码,但没有指定或看起来像这样)。有些人含糊其辞地说,stdafx.h之前的任何#pragma命令都将被忽略。但“”特别提到pragma可以在源代码中覆盖编译器选项。当然,我从来没有使用过stdafx.h,更像是一个unix的家伙,所以也许有一些基本的东西我完全没有

我尝试指定C4101而不是4101,但它无法处理其中的alpha。我尝试过指定#pragma warning(push 2),尽管这会命中我不想做的所有3级和4级警告,但即使如此,仍然会给出4级警告

以下是我的编译器命令行选项:
/MP/GS/W4/Zc:wchar\u 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\pragmaWarning\pragmaWarning.pch”

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

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

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

以下是Microsoft文档:


有些警告是“功能范围”,不能使用
#pragma warning(suppress:4101)
抑制。正如您所注意到的,它们也不能仅通过围绕特定行进行操作来禁用。必须对整个功能禁用此警告:

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

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

警告pragma可能是函数范围的,这意味着它适用于后续函数,而不是声明。也许吧。整个stdafx与你的问题无关,别担心。是的,我可以删除未引用的局部变量。是的,我可以有一行:“I;”或者有一个未使用的_变量宏,它也可以这样做。是的,我可以禁用整个项目的特定警告。但是,我更多的是寻找一种修复方法,用于那些很少出现的情况,即您明确希望关闭特定行的警告,但将其用于其他所有行。一些警告的作用域是函数,而不是代码行,C4101就是其中之一。您需要在功能范围之外禁用它。请注意,“抑制”仅适用于文件中的下一个物理行。Chuck明白了!如果我在函数之前移动push&disable,在函数之后移动pop,它可以正常工作。而且,使用just suppress并不像您所说的下一个物理行那样工作。您如何判断警告的作用域是函数、代码行还是其他内容(VS2013 C4101上的文档)没有指定。对不起,我在我的原始帖子中有两段代码,我曾经尝试过,我可能可以更好地分开。我去把分离弄清楚。其中一个与此相同,仍然导致警告。
#pragma warning(push)
#pragma warning(disable: 4101)
    int i;
    ... more code ...
#pragma warning(pop)
#pragma warning(push)
#pragma warning(disable: 4101)
int main() {
    int i;
}
#pragma warning(pop)