#pragma(*诊断)当将Clang分析器与GCC编译器混合时
#pragma(* diagnostic) when mixing Clang analyzers with a GCC compiler
我在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
是一个仅叮当声的扩展(。
相关文章:
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 初始化迭代器错误 C++ 在 GCC 编译器中
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 为什么 gcc 编译器标志未知?
- 如何使用 GCC 编译器优化创建静态库?
- GCC 编译器是否应该对涉及 [[fallthrough]] 属性的格式错误的C++代码进行诊断?
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- gcc c++编译器中的零大小数组
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- template-id 与任何模板声明 GNU gcc 编译器都不匹配
- 关于 PBC 库在 GCC 编译器在 DEV C++ 中使用
- 选择默认的 gcc/g++ 编译器
- GCC编译器,为较低版本的GCC编译应用程序
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- GCC 编译器错误:stl_construct.h、stl_uninitialized.h
- 如何从我的qt应用程序运行gcc编译器?
- GCC 编译器错误:stl_construct.h
- 升级 gcc 编译器/其他修复程序以向后兼容
- GCC 编译器一个字节中有多少位