clang-format 主要包括使用文件夹前缀排序

clang-format main include sorting with folders prefix

我正在尝试让 clang-format 识别以下设置中 foo.cpp 的主要包含:

project/my_lib
├── CMakeLists.txt
├── include
│   └── project
│       └── my_lib
│           └── foo.hpp
├── src
│   └── foo.cpp
└── tests
    └── foo_test.cpp

foo.cpp有以下内容:

#include <project/another_lib/bar.hpp>
#include <project/my_lib/foo.hpp>
#include <vector>

// ...

我认为我已经确定的问题如下:clang 尝试根据文件名识别 'main' 包含,在本例中为 foo.cpp。当它查看 #include <project/my_lib/foo.hpp> 时,它不会将此识别为此 cpp 文件的 'main' 包含。我知道可以为“主包含文件”逻辑指定后缀,但这里需要的是前缀正则表达式。

关于如何让 clang 将正确的 include 设置为上面示例中的优先级 0 的任何帮助?

参考:Clang format options, section "IncludeCategories" and following

编辑: 我正在使用 Visual Studio 2019 中集成的 clang-format,这意味着我认为我无法访问命令行选项。此外,这是一个共享项目,我想改变默认行为。

作为一个快速更新,哪种方式解决了我的问题:如果包含使用常规引号 ("),那么 clang-format 与 Visual Studio 捆绑在一起似乎会得到“ main" header 并相应地排序。

不理想,但仍然是一个可行的解决方案。

即使您使用的是 Visual Studio,您仍然可以在存储库的顶层拥有一个 .clang-format 文件,并且 Visual studio 将能够检测并应用格式按照文件中设置的规则。

要解决您提到的问题,请使用以下选项。如果您的代码库不使用它,您可以忽略“stdafx.h”。

# Sort includes, import and using declarations.
SortIncludes: true
SortUsingDeclarations: true

IncludeBlocks: Regroup

IncludeIsMainSourceRegex: '$?'

# Group includes, sorting lowest priority number first
IncludeCategories:
  - Regex:           '[<"]stdafx.h'
    Priority:        -1
  - Regex:           '[<"].*(/|\).*'
    Priority:        2
  - Regex:           '^<.*'
    Priority:        1    
  - Regex:           '.*'
    Priority:        3


IncludeIsMainRegex: '([-_](test|unittest))?$'