C++ 让clang tidy修复头文件

C++ 让clang tidy修复头文件,c++,clang++,llvm-clang,automated-refactoring,clang-tidy,C++,Clang++,Llvm Clang,Automated Refactoring,Clang Tidy,我正在将当前使用gcc编译的项目迁移到clang, 还有一堆gcc没有生成的警告(-Winconsistent missing override)clangtidy用于修复*.cpp文件中的这些错误,但是它不会触及hpp文件,因为在数据库中找不到编译命令(如我所料) 我正在使用ninja构建项目,并使用ninja-tcompdbccxx>.build/compile\u commands.json生成编译数据库。我试过跑步: clang-tidy-3.6 -p .build/ \

我正在将当前使用gcc编译的项目迁移到clang, 还有一堆gcc没有生成的警告(
-Winconsistent missing override
clangtidy
用于修复
*.cpp
文件中的这些错误,但是它不会触及
hpp
文件,因为在数据库中找不到编译命令(如我所料)

我正在使用
ninja
构建项目,并使用
ninja-tcompdbccxx>.build/compile\u commands.json
生成编译数据库。我试过跑步:

clang-tidy-3.6 -p .build/      \
      $(find src/ -name *.cpp) \
      $(find src/ -name *.hpp) \
      --checks=misc-use-override --fix
修复错误。它拒绝接触头文件,并抱怨:

Skipping .../src/header/file.hpp. Compile command not found.

我通过指定
--header filter=src/
选项使其工作。 有趣的是,修复程序被多次应用,导致如下输出:

void f() override override override override override;
我通过分别在每个源文件上运行
clangtidy
来解决这个问题。另请注意,用
-p
指定的
还必须包含要应用的样式的
.clang格式
配置

这是命令的当前迭代:

find src/ -name '*.cpp' -exec \
     clang-tidy-3.6 -p . --header-filter=src/ {}
               --checks=misc-use-override --fix
正确使用“-标题过滤器”时要小心。“header”前面没有两个“减号”!不像尼桑特的回答

如图所示:


在clang tidy 9.0中仍然如此。

run-clang-tidy.py脚本中有一个bug。由于文件路径未规范化为唯一路径,因此无法正确合并修复程序。 尝试此修补版本,该版本使用pathlib在linux、windows和macos上正确规范化路径


关于“修复程序被多次应用”:这就是为什么有一个run-clang tidy脚本,它首先收集修复程序,然后一次应用它们。我明白了。虽然没有很好的记录。如果你把它写下来作为一个答案或建议的编辑,我将非常乐意接受。(我已经停止了大量的C++开发,所以我可能不会测试它)但是使用Run-CLANG-Tydi.Py不能解决这个问题。它仍然会处理头文件,并为头文件包含的每个编译单元应用一次修复。唯一的解决方法是按照这个答案的建议,在每个编译单元上依次运行clangtidy-fix,这样它就不会多次看到未固定的头文件。如果使用两个“减号”而不是一个,它真的在乎吗?通常,在大多数应用程序中使用一个或两个并不重要。