.clang-format.yaml

clang-format 的配置文件叫 .clang-format,格式是 YAML。

它的设计理念是:

先继承一种已有风格(Google、LLVM、Microsoft...),然后只修改你关心的选项。

一般不要从零开始写,而是:

BasedOnStyle: Google

然后覆盖需要修改的配置。

一、一个完整的模板(推荐现代 C++ 项目)

这是我比较推荐的一套,介于 Google 和 LLVM 之间,适合 Linux/CUDA/HPC/C++ 项目。

yaml 复制代码
Language: Cpp

# 基础风格
BasedOnStyle: Google

# 缩进
IndentWidth: 4
ContinuationIndentWidth: 4
TabWidth: 4
UseTab: Never

# 一行最大长度
ColumnLimit: 100

# 大括号
BreakBeforeBraces: Attach

# 指针和引用
PointerAlignment: Left
ReferenceAlignment: Left

# 空格
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesInAngles: Never

# include
SortIncludes: CaseSensitive
IncludeBlocks: Preserve

# 命名空间
NamespaceIndentation: None

# switch
IndentCaseLabels: true

# 类访问权限
AccessModifierOffset: -4

# 连续声明
AlignConsecutiveDeclarations: true
AlignConsecutiveAssignments: true

# 参数换行
BinPackArguments: false
BinPackParameters: false

# 构造函数初始化列表
BreakConstructorInitializers: BeforeComma

# Lambda
AllowShortLambdasOnASingleLine: Inline

# if
AllowShortIfStatementsOnASingleLine: Never

# while
AllowShortLoopsOnASingleLine: false

# 函数
AllowShortFunctionsOnASingleLine: Empty

# namespace结束注释
FixNamespaceComments: true

# C++11列表初始化
Cpp11BracedListStyle: true

# 注释
ReflowComments: true

# 空行
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 1

# 自动识别
Standard: Latest

这份配置已经可以覆盖 90% 以上的项目。

二、配置项详解

  1. BasedOnStyle

最重要的一项。

BasedOnStyle: Google

可选:

LLVM

Google

Chromium

Mozilla

Microsoft

GNU

WebKit

例如:

BasedOnStyle: LLVM

或者

BasedOnStyle: Microsoft

一般推荐:

Google

  1. IndentWidth

缩进。

IndentWidth: 4

结果:

if (ok) {

foo();

}

如果:

IndentWidth: 2

就是

if (ok) {

foo();

}

  1. ColumnLimit

每行最大长度。

ColumnLimit: 100

超过会自动换行。

例如:

foo(a,b,c,d,e,f,g,h,i,j,k);

变成:

foo(a,

b,

c,

d,

e);

推荐:

100

Google:

80

LLVM:

80

现代显示器一般推荐 100 或 120。

  1. BreakBeforeBraces

大括号风格。

最常见:

BreakBeforeBraces: Attach

效果:

if (...) {

}

如果:

BreakBeforeBraces: Allman

变成

if (...)

{

}

还有:

Linux

Mozilla

GNU

WebKit

Custom

  1. PointerAlignment

很多团队争论最多的问题。

Left

PointerAlignment: Left

得到

int* p;

Right

PointerAlignment: Right

得到

int *p;

Middle

PointerAlignment: Middle

得到

int * p;

Google:

Left

Linux:

Right

  1. ReferenceAlignment

和指针一样。

int& a;

还是

int &a;

推荐:

ReferenceAlignment: Left

  1. NamespaceIndentation

例如:

namespace foo {

class A {};

}

如果:

NamespaceIndentation: None

保持:

namespace foo {

class A {};

}

如果:

NamespaceIndentation: All

就是

namespace foo {

class A {};

}

LLVM 和 Google 一般都不缩进 namespace。

  1. BinPackArguments

控制函数参数是否尽量塞在同一行。

如果:

BinPackArguments: true

可能得到:

foo(a, b,

c, d,

e);

如果:

BinPackArguments: false

会变成:

foo(

a,

b,

c,

d);

现代代码很多团队喜欢:

false

可读性更高。

  1. AlignConsecutiveDeclarations

例如:

int a;

double b;

float c;

如果:

AlignConsecutiveDeclarations: true

变量会自动对齐。

  1. SortIncludes

例如:

vector

iostream

algorithm

自动变成

algorithm

iostream

vector

推荐:

SortIncludes: CaseSensitive

也可以:

SortIncludes: Never

如果项目对头文件顺序有特殊要求。

  1. IncludeBlocks

例如:

#include

#include "a.h"

#include "b.h"

如果:

IncludeBlocks: Merge

会合并。

推荐:

IncludeBlocks: Preserve

保留人工分组。

  1. AllowShortFunctionsOnASingleLine

例如:

int f() { return 0; }

如果:

AllowShortFunctionsOnASingleLine: None

会展开:

int f() {

return 0;

}

推荐:

Empty

只有空函数保留一行。

三、如何生成默认配置

如果已经安装了 clang-format,可以直接导出某种风格的完整配置:

clang-format -style=google -dump-config > .clang-format

或者:

clang-format -style=llvm -dump-config > .clang-format

生成的文件通常有 250~350 行(不同版本略有差异),包含几乎所有可配置项,非常适合作为参考。你只需要删除不关心的选项,保留需要修改的部分即可。

四、我推荐的模板(适合现代 C++)

如果是新项目,我建议采用以下原则:

  • 基于 Google 风格,保证团队一致性。
  • 4 空格缩进,适合大多数 C++ 项目。
  • 100 列行宽,兼顾可读性和现代宽屏显示器。
  • PointerAlignment: Left、ReferenceAlignment: Left,与 Google 风格一致。
  • 保留 #include 分组,避免自动打乱逻辑分层。
  • 关闭参数打包(BinPackArguments: false、BinPackParameters: false),让长参数列表按行排列,更易于阅读和维护。
  • 限制空行数量,保持代码紧凑但不过于拥挤。

这套配置比较适合你之前讨论过的 Linux、CUDA/HIP、高性能计算和现代 C++ 项目,也便于与 clang-tidy 配合使用。

相关推荐
mrbone113 年前
C++-使用clang-format格式化代码
开发语言·c++·qt·clang-format·格式化