偶尔编写一下根本不会发出警告的C ++代码很困难。然而,启用警告是一个好主意。因此,通常需要禁用某些特定构造周围的警告,并在所有其他代码段中启用它们。
到目前为止,我已经看到了两种方法。
第一个是使用#pragma warning( push )
和#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
将丢弃这些更改。
第一种方法看起来很干净。它有什么问题吗?有没有更好的方法来实现同样的目标?
答案 0 :(得分:40)
这适用于多个编译器(以及不同版本的编译器)。
#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
// ...
此外,包括警卫可以检查没有双推/弹出/禁用警告编译指示。
答案 1 :(得分:36)
对于尖锐的牙齿来说太晚了,但对于所有的googlers:
#pragma warning ( suppress: ThatWarning )
// one single line with ThatWarning
是(通常since VS 2008的缩写,但in VS 2005仅适用于代码分析器警告):
#pragma warning ( push )
#pragma warning ( disable: ThatWarning )
// one single line with ThatWarning
#pragma warning ( pop )
答案 2 :(得分:30)
第一种方法是最好的方法,IMO。我知道它没有任何问题。
请记住,#pragma是特定于编译器的,因此不要指望它适用于每个编译器:)
答案 3 :(得分:13)
正确的方法(虽然有点难看)
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( once: ThatWarning )
#endif
//code with ThatWarning here
#ifdef _MSC_VER
#pragma warning( pop )
#endif
答案 4 :(得分:3)
您可以在项目或文件选项中禁用特定警告,此设置适用于相关范围内每个#pragmas的“默认”。 VS2005中的一些警告是如此无用/烦人,如果使用/W4
,这会清除输出很多。
这是在配置属性下的属性 - &gt; C / C ++ - &gt;高级。
答案 5 :(得分:2)
我对第一个变体没有任何问题。可能更好的方法是使用以下内容:
#pragma warning( push )
#pragma warning( once: ThatWarning )
//code with ThatWarning here
#pragma warning( pop )
这会让你知道代码中仍然有警告,但警告信息不会那么烦人。但那是品味问题。
答案 6 :(得分:0)
第一种方法允许您在本地范围内更改特定的警告设置。它首先通过压入堆栈存储所有当前警告状态,应用您的警告修改,然后还原(弹出)到最后一个警告状态。
#pragma警告(push) #pragma警告(一次:ThatWarning) //在此处使用ThatWarning进行编码 #pragma warning(pop)