LLVM/clang-format代码格式化与CI集成
请介绍 clang-format 的使用方法,包括 .clang-format 配置文件的常见选项、基于不同代码风格(Google/LLVM/Microsoft/Mozilla/Chromium)的预设、以及如何集成到 Git hooks 和 CI 中自动化代码格式化检查。
回答
我是大山
clang-format 用法:
# 查看支持风格
clang-format --style=Google -dump-config > .clang-format
# 格式化文件
clang-format -i main.cpp # 原地修改
clang-format --style=LLVM main.cpp # 用 LLVM 风格
# 检查差异(不修改)
clang-format --dry-run --Werror main.cpp
.clang-format 关键配置:
BasedOnStyle: Google # 起始风格
IndentWidth: 2 # 缩进宽度
ColumnLimit: 80 # 列宽
AccessModifierOffset: -1 # 访问修饰符偏移
AlignConsecutiveAssignments: true # 连续赋值对齐
AllowShortFunctionsOnASingleLine: Inline
BreakBeforeBraces: Attach # 括号风格
PointerAlignment: Left # 指针 * 位置:Left/Right/Middle
SpaceAfterTemplateKeyword: true
Standard: Auto # 自动检测 C++ 标准
UseTab: Never # 是否使用 Tab
预设风格:
Google:2 空格缩进,80 列,类内 public 缩进等。LLVM:2 空格,120 列。Microsoft:4 空格,Allman 括号风格。Mozilla:3 空格。Chromium:Google 风格变体。
Git Hook 集成:
# .git/hooks/pre-commit
#!/bin/sh
files=$(git diff --cached --name-only --diff-filter=ACM | grep '\.cpp$\|\.h$')
if [ -n "$files" ]; then
clang-format -i $files
git add $files
fi
CI 集成:
- name: Check formatting
run: |
find . -name '*.cpp' -o -name '*.h' | xargs clang-format -i --dry-run --Werror