我正在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不可见?
答案 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
是仅铛声的扩展名)。