代码之家  ›  专栏  ›  技术社区  ›  Parker Coates

#pragma(*diagnostic)在将Clang分析器与GCC编译器混合时

  •  1
  • Parker Coates  · 技术社区  · 6 年前

    我在Linux上用GCC进行编译,但是CMake很好地生成了一个兼容的编译数据库。这意味着,我可以在我的代码库上运行新奇的、现代的、基于叮当声的工具,这些工具对如何构建每个文件(标记、定义、包含路径等)都有很好的了解。

    warning: disabled expansion of recursive macro ,生成者 -Wdisabled-macro-expansion . 这个特定的宏是由第三方提供的,因此修复警告不是一个选项,但是我想抑制它,因为它在相关文件中出现过多次。

    • 添加 #pragma clang diagnostic ignored "-Wdisabled-macro-expansion" 禁止对叮当工具发出警告,但会导致GCC发出警告 warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas] .
    • #pragma GCC diagnostic ignored "-Wdisabled-macro-expansion" 禁止发出叮当警告(因为叮当试图与GCC诊断兼容),但会导致GCC发出警告 warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas] .
    • 把上面的任何一个用 #ifdef __clang__ __clang__ ,但与 __GNUC__

    #pragma 对Clang工具可见,但对GCC不可见?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Parker Coates    6 年前

    这个工具非常聪明,知道代码不是用 __clang__ ,但与 __GNUC__

    如果它只报告叮当声警告,但是 想想看 这听起来像是工具的问题。如果它试图那么巧妙地歪曲自己,你可能会陷入困境。。。但是你也应该向工具作者抱怨一开始就造成了这种情况。

    也就是说,你可以尝试:

    #if defined(__has_warning)
    #  if __has_warning("-Wdisabled-macro-expansion")
    #    pragma GCC diagnostic ignored "-Wdisabled-macro-expansion"
    #  endif
    #endif
    

    __has_warning 是一个只有叮当声的扩展)。