代码之家  ›  专栏  ›  技术社区  ›  sharptooth

使用pragma warning push/pop是否是临时更改警告级别的正确方法?

  •  62
  • sharptooth  · 技术社区  · 15 年前

    偶尔会很难编写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 会丢弃那些改动。

    第一种方法看起来很干净。有什么问题吗?有没有更好的方法来达到同样的效果?

    6 回复  |  直到 11 年前
        1
  •  30
  •   Goz    15 年前

    第一种方法是最好的方法,我不知道有什么问题。

    请记住,pragma是特定于编译器的,因此不要期望它适用于所有编译器:)

        2
  •  40
  •   user2288008    11 年前

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

    标题“推”

    #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
    // ...
    

    此外,包含保护可以检查是否没有双推/弹出/禁用警告pragma。

    更新

        3
  •  36
  •   m3tikn0b    12 年前

    对夏普图斯来说太晚了,但是对于所有的谷歌用户来说:

    #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 )
    
        4
  •  13
  •   ronag    15 年前

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

    #ifdef _MSC_VER
     #pragma warning( push )
     #pragma warning( once: ThatWarning )
    #endif
     //code with ThatWarning here
    #ifdef _MSC_VER
     #pragma warning( pop )
    #endif
    
        5
  •  3
  •   Steve Townsend    15 年前

    您可以在项目或文件选项中禁用特定警告,并且根据相关范围内的那些pragma,此设置应用为“默认”。VS2005中的一些警告是非常无用/烦人的,如果使用的话,这会清除相当多的输出。 /W4 .

    这是在配置属性下的属性-gt;c/c++ +gt;

        6
  •  2
  •   Kirill V. Lyadvinsky    15 年前

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

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

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