How to disable GCC warnings for a few lines of code

后端 未结 9 737
我寻月下人不归
我寻月下人不归 2020-11-22 08:32

In Visual C++, it\'s possible to use #pragma warning (disable: ...). Also I found that in GCC you can override per file compiler flags. How can I do this for \"next line\",

9条回答
  •  隐瞒了意图╮
    2020-11-22 09:04

    #define DIAG_STR(s) #s
    #define DIAG_JOINSTR(x,y) DIAG_STR(x ## y)
    #ifdef _MSC_VER
    #define DIAG_DO_PRAGMA(x) __pragma (#x)
    #define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(warning(x))
    #else
    #define DIAG_DO_PRAGMA(x) _Pragma (#x)
    #define DIAG_PRAGMA(compiler,x) DIAG_DO_PRAGMA(compiler diagnostic x)
    #endif
    #if defined(__clang__)
    # define DISABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,push) DIAG_PRAGMA(clang,ignored DIAG_JOINSTR(-W,clang_option))
    # define ENABLE_WARNING(gcc_unused,clang_option,msvc_unused) DIAG_PRAGMA(clang,pop)
    #elif defined(_MSC_VER)
    # define DISABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,push) DIAG_DO_PRAGMA(warning(disable:##msvc_errorcode))
    # define ENABLE_WARNING(gcc_unused,clang_unused,msvc_errorcode) DIAG_PRAGMA(msvc,pop)
    #elif defined(__GNUC__)
    #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406
    # define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,push) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option))
    # define ENABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,pop)
    #else
    # define DISABLE_WARNING(gcc_option,clang_unused,msvc_unused) DIAG_PRAGMA(GCC,ignored DIAG_JOINSTR(-W,gcc_option))
    # define ENABLE_WARNING(gcc_option,clang_option,msvc_unused) DIAG_PRAGMA(GCC,warning DIAG_JOINSTR(-W,gcc_option))
    #endif
    #endif
    

    This should do the trick for gcc, clang and msvc

    Can be called with e.g.:

    DISABLE_WARNING(unused-variable,unused-variable,42)
    [.... some code with warnings in here ....]
    ENABLE_WARNING(unused-variable,unused-variable,42)
    

    see https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html, http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas and https://msdn.microsoft.com/de-DE/library/d9x1s805.aspx for more details

    You need at least version 4.02 to use these kind of pragmas for gcc, not sure about msvc and clang about the versions.

    It looks like the push pop pragma handling for gcc is a little bit broken. If you enable the warning again, you still get the warning for the block that was inside the DISABLE_WARNING/ENABLE_WARNING block. For some versions of gcc it works, for some it doesn't.

提交回复
热议问题