78

有时很难编写完全不会发出警告的 C++ 代码。然而,启用警告是个好主意。因此,通常需要禁用围绕某些特定构造的警告,并在所有其他代码段中启用它们。

到目前为止,我已经看到了两种方法。

第一个是使用#pragma warning( push )and #pragma warning( pop )

 #pragma warning( push )
 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

第二个是使用#pragma warning( default )

 #pragma warning( disable: ThatWarning )
 //code with ThatWarning here
 #pragma warning( default: ThatWarning )

我在第二个变体中看到的问题是它丢弃了原始的警告级别——警告可能在此之前已经关闭,或者它的警告级别可能已经改变。使用default将丢弃这些更改。

第一种方法看起来很干净。有什么问题吗?有没有更好的方法来实现同样的目标?

4

7 回答 7

48

这将适用于多个编译器(以及不同版本的编译器)。

标题“推”

#if defined(__clang__)
# pragma clang diagnostic push
#endif

#if defined(_MSC_VER)
# pragma warning(push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler push warning
#endif

标题“流行”

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

一些警告

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

用法

// This code reports warnings
// ...
#include <ignore_compiler_warning/push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

另外包括警卫可以检查没有双推/弹出/禁用警告编译指示。

更新

于 2013-08-27T11:21:53.157 回答
41

第一种方法是最好的方法,IMO。我知道它没有问题。

请记住,#pragma 是特定于编译器的,所以不要期望它可以在每个编译器上工作:)

于 2010-11-16T11:08:45.663 回答
41

对尖牙来说太晚了,但对于所有的谷歌人来说:

#pragma warning ( suppress: ThatWarning )
// one single line with ThatWarning

是缩写(通常从 VS 2008 开始,但在 VS 2005中仅用于代码分析器警告):

#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
于 2013-08-27T09:12:25.583 回答
13

正确的做法(虽然有点难看)

#ifdef _MSC_VER
 #pragma warning( push )
 #pragma warning( once: ThatWarning )
#endif
 //code with ThatWarning here
#ifdef _MSC_VER
 #pragma warning( pop )
#endif
于 2010-11-16T12:20:44.623 回答
3

您可以在项目或文件选项中禁用特定警告,并且此设置适用于相关范围内每个#pragmas 的“默认”。VS2005 中的一些警告是如此无用/烦人,如果使用/W4.

这是在配置属性 -> C/C++ -> 高级下的属性中。

于 2010-11-16T12:30:43.527 回答
2

我对第一个变体没有任何问题。可能更好的方法是使用以下方法:

 #pragma warning( push )
 #pragma warning( once: ThatWarning )
 //code with ThatWarning here
 #pragma warning( pop )

这会让你知道代码中仍然有警告,但警告消息不会那么烦人。但这就是品味问题。

于 2010-11-16T11:22:18.233 回答
0

第一种方法允许您更改本地范围内的特定警告设置。它首先通过压入堆栈存储所有当前警告状态,应用您的警告修改,然后恢复(弹出)到最后一个警告状态。

#pragma warning( push ) #pragma warning( once: ThatWarning ) //此处带有 ThatWarning 的代码 #pragma warning( pop )

于 2020-04-23T18:01:13.303 回答