#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 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 不可见?
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 的扩展)。
我正在 Linux 上使用 GCC 进行编译,但 CMake 足以生成与 Clang 兼容的编译数据库。这意味着我可以在我的代码库上 运行 花哨的、基于现代 Clang 的工具,并且这些工具非常了解如何构建每个文件(标志、定义、包含路径等)。到目前为止一切顺利。
但是今天我的 IDE 中基于 Clang 的静态分析开始显示特定于 Clang 的警告。我不认为它是哪个警告对我的问题特别重要,但它是由 -Wdisabled-macro-expansion
生成的 warning: disabled expansion of recursive macro
。这个特定的宏是由第三方提供的,因此修复警告不是一个选项,但我想禁止它,因为它在相关文件中多次出现。
我正在努力解决的问题是如何抑制基于 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 不可见?
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 的扩展)。