#pragma(*诊断)当将Clang分析器与GCC编译器混合时

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

本文关键字:GCC 编译器 混合 分析器 Clang 诊断 当将 #pragma      更新时间:2023-10-16

我在Linux上使用GCC进行编译,但是CMake很好心地生成了一个与Clang兼容的编译数据库。这意味着我可以在我的代码库上运行花哨的、基于Clang的现代工具,并且这些工具完全了解每个文件的构建方式(标志,定义,包含路径等(。目前为止,一切都好。

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

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

  • 添加#pragma clang diagnostic ignored "-Wdisabled-macro-expansion"会禁止显示 Clang 工具的警告,但会导致 GCC 发出warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
  • 同样,添加#pragma GCC diagnostic ignored "-Wdisabled-macro-expansion"会禁止显示 Clang 警告(因为 Clang 尝试与 GCC 诊断兼容(,但会导致 GCC 发出warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas]
  • #ifdef __clang__包装上述任何一项都会让 GCC 满意,但不会抑制 Clang 警告,因为该工具足够智能,知道代码不是用__clang__编译的,而是用__GNUC__编译的。

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

该工具足够聪明,知道代码不是用__clang__编译的,而是用__GNUC__编译的。

如果它报告仅发出叮当声警告,但认为没有定义__clang__,这听起来像是工具的问题。如果它试图那么聪明地歪曲自己,你可能会在小溪上......但是,您也应该向工具作者抱怨首先创建这种情况。

也就是说,您可以尝试:

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

我不确定这是否有效...这取决于工具假装不叮当的难度(__has_warning是一个仅叮当声的扩展(。