You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改.clang-format的IncludeCategories配置实现指定头文件排序?

问题

在项目中使用.clang-format配置编码风格,通过IncludeCategories模块设置头文件排序规则,当前配置如下:

IncludeCategories:
  - Regex: '^"(?!3rd|vendor).*\.(h|hpp)"$'
    Priority: 1
    # This category matches project headers, such as "module.h"

  - Regex: '^"(3rd|vendor).*\.(h|hpp)"$'
    Priority: 2
    # This category matches third-party headers, such as "3rd/module.h" or "vendor/module.hpp"

  - Regex: '^<.*\.(h|hpp)>'
    Priority: 3
    # This category matches system headers, such as <sys/netport.h>

  - Regex: '^<[^.>]+>$'
    Priority: 4
    # This category matches standard library, such as <iostream>

期望项目头文件排在最顶部,3rd或vendor目录下的第三方头文件次之,但实际运行后,项目头文件反而排在最后,不符合预期。

项目结构:

.
├── CMakeLists.txt
├── .clang-format
├── include
│   ├── 3rd
│   │   └── constant.h
│   ├── sub
│   │   ├── sub.h
│   │   └── xx.hpp
│   └── work.h
└── src
    ├── main.cpp
    └── work.cpp

预期头文件排序效果:

// main.cpp
#include "sub/sub.h"
#include "work.h"

#include "3rd/util.h"

#include <sys/netport.h>

#include <iostream>

int main() {
  return 0;
}

实际得到的结果:

// main.cpp
#include "3rd/util.h"

#include <sys/netport.h>

#include <iostream>

#include "sub/sub.h" // <<-- should be at the top
#include "work.h"    // <<-- should be at the top

int main() {
  return 0;
}

请问该如何修改配置以达到预期的头文件排序效果?


解决方法

问题核心是原正则的负向预查逻辑未正确匹配项目头文件,导致这类文件落入默认低优先级类别,最终排在末尾。以下是修正后的配置:

通用修正版(推荐)

IncludeCategories:
  - Regex: '^"(?!(3rd|vendor)/).*\.(h|hpp)"$'
    Priority: 1
    # 匹配不以3rd/或vendor/开头的项目头文件

  - Regex: '^"(3rd|vendor)/.*\.(h|hpp)"$'
    Priority: 2
    # 匹配3rd或vendor目录下的第三方头文件

  - Regex: '^<.*\.(h|hpp)>'
    Priority: 3
    # 匹配带后缀的系统头文件,如<sys/netport.h>

  - Regex: '^<[^.>]+>$'
    Priority: 4
    # 匹配无后缀的标准库头文件,如<iostream>

针对当前项目的精准匹配版

如果项目结构固定,也可以直接指定项目内的头文件目录,避免正则歧义:

IncludeCategories:
  - Regex: '^"(sub/.*|work\.h)"$'
    Priority: 1
    # 匹配sub目录下的头文件和根级work.h

  - Regex: '^"(3rd|vendor)/.*\.(h|hpp)"$'
    Priority: 2

  - Regex: '^<.*\.(h|hpp)>'
    Priority: 3

  - Regex: '^<[^.>]+>$'
    Priority: 4

关键修改说明

  1. 明确排除规则:将原正则的(?!3rd|vendor)改为(?!(3rd|vendor)/),通过路径分隔符/精准排除指定目录下的文件,避免误匹配文件名含3rd但不在对应目录的情况。
  2. 确保匹配覆盖:修正后的正则能准确命中所有项目自身的头文件,让它们进入最高优先级(Priority:1)的分组,从而排在最顶部。

内容的提问来源于stack exchange,提问作者magicianlib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:05:19