CodeWalk

LLVM/clang-format代码格式化与CI集成

作者:我是大山 · 2026-05-30 12:55

请介绍 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