关于 clang-tidy 和新版 GCC 头文件不兼容的问题

  • 963 字
  • 次阅读
  • 条评论
  1. 1. 解决方案

众所周知,C++是一个连搭建环境都能折磨人的语言。不巧的是,LLVM 与 GCC 之间也能擦出激烈的火花,起因如下:

gcc 是世界上最好的编译器,不接受反驳,因而我毫不犹豫地选择了 gcc。但我是 windows 平台,所以我选择了 winlibs,再搭配上 vscode 的 cpp 插件,代码高亮、代码提示、代码检查一应俱全。不幸的是,一旦将 gcc 升级至最新版(gcc 13/14),你的代码将发生如下变化:

bf16

1
c++config.h(827, 25): invalid suffix 'bf16' on floating constant

那么bf16究竟是什么东东?

bf16其实是一个字面量后缀,表示一种定宽浮点类型,也即std::bfloat16_t。其它定宽浮点类型有:

类型 字面量后缀 C 语言类型
std::float16_t f16 或 F16 _Float16
std::float32_t f32 或 F32 _Float32
std::float64_t f64 或 F64 _Float64
std::float128_t f128 或 F128 _Float128
std::bfloat16_t bf16 或 BF16

看来是 clang-tidy 不认识bf16这个字面量。这几个类型在 C++23 被引入,那么我们把标准切换至 C++23 是不是就解决了呢?

根本没解决

好家伙,问题更严重了,clang-tidy 不仅不认识bf16,上面几个类型几乎就没一个认识的。事实上 clang-tidy 只支持std::float16_t _Float16。一旦引入的头文件涉及这些类型(比如<format>)就会被 clang-tidy 逮住报错。

除了不支持定宽浮点类型导致不兼容,clang-tidy 还会不认识 GCC 的一些内建函数。当头文件使用到这些函数时,也会被 clang-tidy 缠着不放。

解决方案

更改c_cpp_properties.json

不让 clang-tidy 分析 GCC 的标准库即可,可以使用 clang 自己的标准库,或者 msvc。
缺点就是,这俩库不支持的特性,即使 GCC 可以使用且通过编译,clang-tidy 依然会缠着不放。

这里

分享这一刻
让朋友们也来瞅瞅!