c++ - 启用 c++20 编译时 clang-tidy 发出警告
问题描述
我最近更新了我的项目及其 CI 管道以使用 C++20 功能。当我将编译器设置更改为使用 C++20 时,clang-tidy 开始为我检查的所有文件发出以下警告(我将它们视为错误):
error: invalid case style for template parameter 'expr-type' [readability-identifier-naming,-warnings-as-errors]
我可以使用 CMake 和 clang-tidy 配置文件将其缩小到以下最小示例:
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(clang_tidy_warning LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(clang_tidy_warning main.cpp)
.clang-tidy
Checks: >
readability-*,
WarningsAsErrors: '*'
CheckOptions:
- {key: readability-identifier-naming.TemplateParameterCase, value: lower_case}
- {key: readability-identifier-naming.TypeTemplateParameterCase, value: CamelCase }
- {key: readability-identifier-naming.TemplateParameterPrefix, value: t_ }
- {key: readability-identifier-naming.TypeTemplateParameterPrefix, value: T_ }
主文件
#include <iostream>
int main() { return 0; }
您应该能够在 Ubuntu 20.04 中使用从根目录开始的以下命令来重现它:
mkdir build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=DEBUG ..
run-clang-tidy-12 -quiet
如果您执行以下操作之一,错误/警告会消失:
- 从配置文件中删除指定的检查选项
- 将 c++ 标准设置为 17
- 删除
#include
主文件中的
与另一个标准库头文件交换iostream
没有帮助,但我还没有对它们进行全部测试。还值得一提的是,所有其他可能的 clang-tidy 配置选项都不会导致此错误。我几乎将所有这些都放在原始配置文件中,并删除了不会导致错误的那些。似乎只有TemplateParameter
andTypeTemplateParameter
子选项受此影响。我已经测试了 clang-tidy 版本 9、10 和 12。所有版本都发出相同的警告。我还测试了将不同的编译器(clang 12 和 gcc10)传递给 CMake。没有改变任何东西(不知道 clang-tidy 是否会受到编译器选择的影响,我猜不是)。我使用的是 Ubuntu 20.04(最新),您还可以在 GitHub 操作运行程序中重现该错误。
所以我的问题是。这是一个(已知的)错误还是在这个整洁的设置中与 C++ 20 有任何不兼容?如果已经知道,您能否解释一下为什么会发生以及如何解决?
编辑
正如 Lawrence Benson 在评论中提到的,这也可能与操作系统有关。他无法在 Mac 上复制,但在 Ubuntu 上。
相关错误报告
这是 0x5453 发现的相关错误报告的链接:点击我
更新:正如“Buster”在评论中指出的那样,错误报告已移至 此处
解决方案
推荐阅读
- cookies - Power Apps 门户。是否可以在我的主域中存储 cookie,然后在子域下访问它?
- javascript - 通过 ejs 动态呈现包含特定类的 div 的值
- git - 在eclipse中找不到git同步功能
- node.js - 尽管安装了 dotenv,node-pg-migration 仍未读取 .env 文件
- cron - Cron Expresson 0 0 3-5 ? * * 假设在凌晨 3 点、4 点、5 点触发
- deep-learning - 自编码器的稀疏性是否已知?
- unity3d - 我无法在 Unity U 建模器中围绕边缘挤出对象
- c# - 使用 System.Net.ICredentials 进行承载身份验证
- spring-boot - 如何使用 swagger 3 spring boot 记录 Spring Data 休息端点
- javascript - Why does Vue 3's `setup(props) { props.id }` return undefined