Is using #pragma warning push/pop the right way to temporarily alter warning level?

后端 未结 7 1528
别跟我提以往
别跟我提以往 2020-11-28 04:00

Once in a while it\'s difficult to write C++ code that wouldn\'t emit warnings at all. Having warnings enabled is however a good idea. So it is often necessary to disable wa

相关标签:
7条回答
  • 2020-11-28 04:10

    The first method is the best way to do it, IMO. I know of no problems with it.

    Simply bear in mind that a #pragma is compiler specific so don't expect it to work on every compiler out there :)

    0 讨论(0)
  • 2020-11-28 04:15

    This will work with multiple compilers (and different versions of compilers).

    Header "push"

    #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
    

    Header "pop"

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

    Some warning

    #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
    

    Usage

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

    Additionally include guards can check that there is no double push/pop/disable-warning pragmas.

    Update

    • Implementation
    • List of available warnings
    • CMake companion function to generate flags
    0 讨论(0)
  • 2020-11-28 04:15

    Too late for sharptooth but for all the googlers out there:

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

    is short for (generally since VS 2008, but in VS 2005 for Code Analyzer warnings only):

    #pragma warning ( push )
    #pragma warning ( disable: ThatWarning )
    // one single line with ThatWarning
    #pragma warning ( pop )
    
    0 讨论(0)
  • 2020-11-28 04:16

    The correct approach (although a bit ugly)

    #ifdef _MSC_VER
     #pragma warning( push )
     #pragma warning( once: ThatWarning )
    #endif
     //code with ThatWarning here
    #ifdef _MSC_VER
     #pragma warning( pop )
    #endif
    
    0 讨论(0)
  • 2020-11-28 04:16

    You can disable specific warnings in the project or file options and this setting applies as the 'default' per those #pragmas at the relevant scope. Some of the warnings in VS2005 are so useless/annoying that this cleans up the output quite a bit, if using /W4.

    This is in Properties under Configuration Properties -> C/C++ -> Advanced.

    0 讨论(0)
  • 2020-11-28 04:25

    The first approach allows you change the specific warning setting in a local scope. It first stores all the current warning state by push into stack, apply your warning modifications, then restore (pop) to last warning state.

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

    0 讨论(0)
提交回复
热议问题