众所周知,C++是一个连搭建环境都能折磨人的语言。不巧的是,LLVM 与 GCC 之间也能擦出激烈的火花,起因如下:
gcc 是世界上最好的编译器,不接受反驳,因而我毫不犹豫地选择了 gcc。但我是 windows 平台,所以我选择了 winlibs,再搭配上 vscode 的 cpp 插件,代码高亮、代码提示、代码检查一应俱全。不幸的是,一旦将 gcc 升级至最新版(gcc 13/14),你的代码将发生如下变化:

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 缠着不放。
解决方案

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