启用对编译器警告消息行为的选择性修改。
语法
#pragma warning(
[ ]
[ ... ]
[ n ]
#pragma warning( pop )
言论
以下警告说明符参数可用。
| warning-specifier (警告说明符) | 意义 |
|---|---|
| 、、、 | 将给定级别应用于指定的警告。 例如: 关闭警告 5033(通常是 1 级警告),除非警告级别设置为 或更高。 还可用于打开默认情况下处于关闭状态的指定警告。 |
default |
将警告行为重置为其默认值。 此外,还打开默认关闭的指定警告。 警告将在其默认级别、记录级别生成。 有关详细信息,请参阅默认情况下关闭的编译器警告 |
disable |
不要发出指定的警告消息。 允许 optional 属性。 |
error |
将指定的警告报告为错误。 |
once |
仅显示一次指定的消息。 |
suppress |
在堆栈上推送 的当前状态,禁用下一行的指定警告,然后弹出警告堆栈,以便重置 状态。 |
justification |
描述禁用或禁止警告的原因的可选字符串。 Visual Studio 2022 版本 17.14 中引入。 |
下面的代码语句演示了 参数可以包含多个警告号,并且可以在同一 指令中指定多个 参数。
#pragma warning( disable : 4507 4034; once : 4385; error : 164 )
但是,当该字段存在时 ,只能指定一个警告编号。 以下代码语句说明了该 字段的用法。
#pragma warning( disable : 4507, justification : "This warning is disabled" )
使用 字段解释警告被禁用或禁止的原因。 该字段仅支持 和 。 指定选项时,静态分析结果交换格式 (SARIF) 输出中将显示理由。 它的值是 UTF-8 编码的窄字符串文字。 若要生成 SARIF 文件,请使用 编译器选项。
此指令在功能上等效于以下代码:
// Disable warning messages 4507 and 4034.
#pragma warning(disable : 4507 4034)
// Issue warning C4385 only once.
#pragma warning(once : 4385)
// Report warning C4164 as an error.
#pragma warning(error : 164)
编译器将 4000 添加到介于 0 到 999 之间的任何警告编号。
范围 4700-4999 中的警告编号与代码生成相关联。 对于这些警告,当编译器到达函数定义时,警告的状态将仍然对函数的其余部分有效。 使用函数中的 更改大于 4699 的警告号的状态仅在函数末尾后生效。 以下示例演示了正确放置 以禁用代码生成警告消息,然后还原它。
// pragma_warning.cpp
// compile with: /W1
#pragma warning(disable:4700)
void Test()
{
int x;
int y = x; // no C4700 here
#pragma warning(default:4700) // C4700 enabled after compiling Test()
}
int main()
{
int x;
int y = x; // C4700
}
请注意,在整个函数正文中, 的最后一个设置将对整个函数生效。
推送和弹出
还支持以下语法,其中可选的 n 参数表示警告级别(1 到 4)。
#pragma warning( push [ , n ] )
#pragma warning( pop )
存储每个警告的当前警告状态。 存储每个警告的当前状态,并将全局警告级别设置为 n。
弹出推送到堆栈的最后一个警告状态。 取消对 和 之间的警告状态所做的任何更改。 请考虑以下示例:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
// Some code
#pragma warning( pop )
在此代码结束时, 将每个警告的状态(包括 4705、4706 和 4707)还原到代码开头的状态。
编写头文件时,可以使用 和 来保证用户所做的警告状态更改不会阻止标头正确编译。 在标头的开头使用 ,并在末尾使用 。 例如,你可能具有在警告级别 4 上无法完全编译的标头。 以下代码将警告级别更改为 3,然后在标头末尾还原原始警告级别。
#pragma warning( push, 3 )
// Declarations/definitions
#pragma warning( pop )
在 和
同时提供对警告抑制的精细控制:
-
[[gsl::suppress]]仅禁止Microsoft C++ Code Analysis发出的警告。 将其与 C++ 核心准则检查一起使用,该检查可应用于范围或特定声明。 - 可用于任何编译器警告。 当需要在特定代码块中禁止显示警告而不显著更改代码的结构时,它很有用。
尽可能使用 [[gsl::suppress]] 来禁止Microsoft C++ Code Analysis警告。
有关帮助取消警告的编译器选项的详细信息,请参阅 和 。
另请参阅
Pragma 指令和 和 关键字