clang-format 是什么
clang-format 按仓库根目录或子目录里的 .clang-format 配置格式化 C、C++ 等语言代码。它内置若干基座风格:LLVM、Google、Chromium、Mozilla、WebKit、Microsoft,选定基座后再覆盖少量选项即可,不必逐条手写全部格式规则。
基本信息
| 基座风格 | LLVM / Google / Chromium / Mozilla / WebKit / Microsoft |
|---|---|
| 配置文件 | .clang-format,含 BasedOnStyle 与覆盖项 |
| 常用命令 | clang-format -i 就地格式化,--dry-run 只检查不改 |
| 适用范围 | C、C++、Java、JavaScript、Protobuf 等 |
典型使用场景
- 项目初始化:选一个基座风格,把配置文件提交进仓库
- 提交前统一格式:配合钩子只对暂存文件就地格式化
- CI 检查:用 dry-run 让格式不合规的改动直接失败
- 局部例外:生成代码或特定目录用子配置与禁用注释处理
- 历史文件逐步纳入:按目录分批启用,避免一次性巨量重排
配置原则
- 先选基座,再只改确有必要的几项
- 调整列宽与缩进这类全局项要格外谨慎
- 子目录配置只用于确有必要的例外场景
- 工具版本写进工具链,避免升级后全库重排
配置与命令
配置与命令
BasedOnStyle: Google
ColumnLimit: 100
IndentWidth: 4
# 就地格式化:clang-format -i src/main.cpp
# 只检查不改:clang-format --dry-run --Werror src/main.cpp常用选项
| 选项 | 作用 | 注意事项 |
|---|---|---|
| BasedOnStyle | 选择基座风格 | 切换基座会导致全库重排 |
| ColumnLimit | 每行最大列数 | 影响面广,最好一次定下来 |
| IndentWidth | 缩进宽度 | 与 EditorConfig 的取值保持一致 |
| SortIncludes | 是否排序 include | 与其它工具的顺序约定要对齐 |
选定基座后尽量少改选项:每多加一项覆盖,被重排的历史文件范围就扩大一圈。
格式化工具的价值在于消除分歧:同一份配置跑出来的结果是唯一的,评审时就不必再讨论换行该放在哪里。
把格式化与代码评审分开:格式化单独成一次提交,评审者才看得清哪些是真正的逻辑改动。
每个目录各自为政的 .clang-format:跨目录复用的代码被反复重排,评审负担陡增。