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

时间:2018-09-24 18:26:46

标签: c++ gcc clang compiler-warnings suppress-warnings

我正在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不可见?

1 个答案:

答案 0 :(得分:1)

  

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

如果它正在报告仅警告的警告,但不是认为定义了__clang__,这听起来像是工具问题。如果要尝试巧妙地对自己的虚假陈述,那么您可能会犯错……但是您也应该向工具作者抱怨,首先要造成这种情况。

也就是说,您可以尝试:

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

我不确定这是否行得通……这取决于工具伪装成不铛声的难度(__has_warning是仅铛声的扩展名)。