使用#pragma警告推送/弹出来临时更改警告级别的正确方法是吗?

问题描述 投票:70回答:7

有时,很难编写完全不会发出警告的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将丢弃这些更改。

第一种方法看起来很干净。有什么问题吗?有没有更好的方法可以达到相同目的?

c++ visual-c++ warnings compiler-warnings pragma
7个回答
37
投票

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

请紧记#pragma是编译器特定的,因此不要指望它可以在每个编译器上运行:)


41
投票

这将与多个编译器(和不同版本的编译器一起使用。)>

标题“推送”
#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

标题“ pop”
#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
// ...

另外,守卫还可以检查是否没有双重推送/弹出/禁用警告语用说明。

更新

  • List of available warnings
  • CMake companion function to generate flags

  • 37
    投票

    对于锋利的牙齿来说太迟了,但是对那里所有的谷歌人来说:


    13
    投票

    正确的方法(尽管有点难看)


    3
    投票

    您可以在项目或文件选项中禁用特定的警告,并且根据相关范围内的#pragma,此设置将作为默认值。 VS2005中的某些警告是如此的无用/烦人,以至于如果使用/W4,这将清理输出很多。


    2
    投票

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


    0
    投票

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

    © www.soinside.com 2019 - 2024. All rights reserved.