代码之家  ›  专栏  ›  技术社区  ›  Jon-Eric

有选择地只对翻译单元的一部分禁用GCC警告?

  •  81
  • Jon-Eric  · 技术社区  · 15 年前

    最接近的GCC等价于这个MSVC预处理器代码是什么?

    #pragma warning( push )                    // Save the current warning state.
    #pragma warning( disable : 4723 )          // C4723: potential divide by 0
    // Code which would generate warning 4723.
    #pragma warning( pop )                     // Restore warnings to previous state.
    

    我们在通常包含的头中有代码,不希望生成特定的警告。但是,我们希望包含这些头的文件继续生成该警告(如果项目启用了该警告)。

    4 回复  |  直到 6 年前
        1
  •  91
  •   Pavel P    6 年前

    这是 possible in GCC 从4.6版开始,或者大约在2010年6月在后备箱中。

    下面是一个例子:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic error "-Wuninitialized"
        foo(a);         /* error is given for this one */
    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */
    #pragma GCC diagnostic pop
        foo(c);         /* error is given for this one */
    #pragma GCC diagnostic pop
        foo(d);         /* depends on command line options */
    
        2
  •  34
  •   chaos    15 年前

    最接近的是 GCC diagnostic pragma , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever" . 它不太接近你想要的,查看链接了解详细信息和注意事项。

        3
  •  32
  •   Tom    14 年前

    我也做过类似的事情。对于第三方代码,我根本不想看到任何警告。所以,与其详细说明 -I/path/to/libfoo/include 我用过 -isystem /path/to/libfoo/include . 这使得编译器出于警告的目的将这些头文件视为“系统头文件”,只要不启用 -Wsystem-headers 你基本上是安全的。我仍然看到一些警告泄露出去,但它减少了大部分垃圾。

    注意这个 只有 如果可以通过include目录隔离有问题的代码,则可以帮助您。如果它只是你自己项目的一个子集,或者与其他代码混杂在一起,那你就走运了。

        4
  •  1
  •   Not a real meerkat    6 年前

    这是对 Matt Joiner's answer .

    如果不想在代码中生成所有的pragma,可以使用 _Pragma operator :

    #ifdef __GNUC__
    #  define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
    #  define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
    #  define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
    #  define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
    #endif
    // (...)
    
    DIAGNOSTIC_ERROR("-Wuninitialized")
    foo(a); // Error
    
    DIAGNOSTIC_PUSH
    DIAGNOSTIC_IGNORE("-Wuninitialized")
    foo(a); // No error
    
    DIAGNOSTIC_POP
    foo(a); // Error