通过


warning pragma

启用对编译器警告消息行为的选择性修改。

语法

#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 指令和 和 关键字