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

#pragma(* diagnostic) when mixing Clang analyzers with a GCC compiler

我正在 Linux 上使用 GCC 进行编译,但 CMake 足以生成与 Clang 兼容的编译数据库。这意味着我可以在我的代码库上 运行 花哨的、基于现代 Clang 的工具,并且这些工具非常了解如何构建每个文件(标志、定义、包含路径等)。到目前为止一切顺利。

但是今天我的 IDE 中基于 Clang 的静态分析开始显示特定于 Clang 的警告。我不认为它是哪个警告对我的问题特别重要,但它是由 -Wdisabled-macro-expansion 生成的 warning: disabled expansion of recursive macro。这个特定的宏是由第三方提供的,因此修复警告不是一个选项,但我想禁止它,因为它在相关文件中多次出现。

我正在努力解决的问题是如何抑制基于 Clang 的分析工具中的警告,而不会在 GCC 构建中引起新的警告。

有没有办法让诊断 #pragma 对 Clang 工具可见,但对 GCC 不可见?

the tooling is smart enough to know that the code isn't compiled with __clang__, but with __GNUC__ instead

如果它报告仅 clang 警告,但 认为 __clang__ 已定义,这听起来像是工具的问题。如果它试图在歪曲自己方面变得那么聪明,你可能会犯错......但你也应该首先向工具作者抱怨造成这种情况。

也就是说,你可以试试:

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

我不确定这是否有效...这取决于工具假装不是 clang 的难度(__has_warning 是仅 clang 的扩展)。