VS2013忽略杂注警告禁用
VS2013 ignoring pragma warning disable
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 警告(关于 I 是一个未引用的局部变量。)这是一个 4 级警告。
但是,它仍然给我警告。即使我关闭被视为错误的警告,它仍然会给我警告,尽管它会编译,因为没有错误。
我没有使用预编译的 headers / stdafx.h。我看到其他一些问题说这种 pragma 技术可以解决实际代码(也许他们的意思是 headers 中的代码,但没有指定或看起来像那样)。其他一些人含糊其辞地说 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"
如您所见,这些命令行选项忽略了被视为错误的警告。
我同意,#pragma warning(suppress: 4101)
应该这样做。
问:为什么不试试 #pragma warning(disable: 4101)
?
或者
#pragma warning(push)
#pragma warning(disable: 4101)
int i;
... more code ...
#pragma warning(pop)
这是 Microsoft 文档:
一些警告是 'function scope' 并且不能使用 #pragma warning(suppress: 4101)
来抑制。正如您所指出的,它们也不能通过围绕特定行进行禁用来禁用。您必须为整个函数禁用此警告:
#pragma warning(push)
#pragma warning(disable: 4101)
int main() {
int i;
}
#pragma warning(pop)
另请注意,对于特定于行而非范围的警告,#pragma warning(suppress: xxx)
的使用特定于文件中的下一个实际行。
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 警告(关于 I 是一个未引用的局部变量。)这是一个 4 级警告。
但是,它仍然给我警告。即使我关闭被视为错误的警告,它仍然会给我警告,尽管它会编译,因为没有错误。
我没有使用预编译的 headers / stdafx.h。我看到其他一些问题说这种 pragma 技术可以解决实际代码(也许他们的意思是 headers 中的代码,但没有指定或看起来像那样)。其他一些人含糊其辞地说 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"
如您所见,这些命令行选项忽略了被视为错误的警告。
我同意,#pragma warning(suppress: 4101)
应该这样做。
问:为什么不试试 #pragma warning(disable: 4101)
?
或者
#pragma warning(push)
#pragma warning(disable: 4101)
int i;
... more code ...
#pragma warning(pop)
这是 Microsoft 文档:
一些警告是 'function scope' 并且不能使用 #pragma warning(suppress: 4101)
来抑制。正如您所指出的,它们也不能通过围绕特定行进行禁用来禁用。您必须为整个函数禁用此警告:
#pragma warning(push)
#pragma warning(disable: 4101)
int main() {
int i;
}
#pragma warning(pop)
另请注意,对于特定于行而非范围的警告,#pragma warning(suppress: xxx)
的使用特定于文件中的下一个实际行。