官网
Clang-Format Style Options — Clang 18.0.0git documentation (llvm.org)
ClangFormat — Clang 18.0.0git documentation (llvm.org)
获取.clang-formatc参数方法,找到clang-format.exe所在位置,然后执行命令,即可导出对应风格的参数
clang-format.exe -style=llvm -dump-config > .clang-format
不需要格式化整个文件, 只需要格式化选中部分(快捷键ctrl + i).
要求:
- 行宽不超过 120 个字
- 使用空格进行缩进,每次缩进 4 个空格
- 函数声明和定义的返回类型和函数名在同一行;函数参数列表超出行宽时要换行并合理对齐
- 函数调用入参列表应放在一行,超出行宽换行时,保持参数进行合理对齐
- if 语句、循环语句必须要使用大括号
- switch 语句的 case/default 要缩进一层
- 多个变量定义和赋值语句不允许写在一行
- 指针类型“*”跟随变量名或者类型,不要两边都留有或者都没有空格
- 引用类型”&“跟随变量名或者类型,不要两边都留有或者都没有空格
- 在每个类声明之后、每个函数定义结束之后都要加空行
- 在一个函数体内,逻辑上密切相关的语句之间不加空行,其他地方应合理添加空行分隔
- 水平空格应该突出关键字和重要信息,避免不必要的留白
- 类访问控制块的声明依次序是 public:, protected:, private:,缩进和class 关键字对齐
- 禁止空有格式的函数头注释
- 代码注释放于对应代码的上方或右边
- 注释符与注释内容间要有 1 空格;右置注释与前面代码至少 1 空
水平空格应该突出关键字和重要信息,避免不必要的留白 水平空格应该突出关键字和重要信息,每行代码尾部不要加空格。总体规则如下:
- if, switch, case, do, while, for 等关键字之后加空格;
- 小括号内部的两侧,不要加空格;
- 大括号内部两侧有无空格,左右必须保持一致;
- 一元操作符(& * + ‐ ~ !)之后不要加空格;
- 二元操作符(= + ‐ < > * / % | & ^ <= >= == != )左右两侧加空格
- 三目运算符(? :)符号两侧均需要空格
- 前置和后置的自增、自减(++ —)和变量之间不加空格 结构体成员操作符(. ->)前后不加空格
- 逗号(,)前面不加空格,后面增加空格
- 对于模板和类型转换(<>)和类型之间不要添加空格
- 域操作符(::)前后不要添加空格
- 冒号(:)前后根据情况来判断是否要添加空格
# yaml-language-server: $schema=https://json.schemastore.org/clang-format.json
# https://json.schemastore.org/clang-format.json里的@ref标注最新clang format支持的每个字段,含义和对应的枚举值
# 基础风格(基于 LLVM 风格)
BasedOnStyle: LLVM
Language: Cpp # 主要针对 C++
# 全局配置
ColumnLimit: 120 # 行宽限制
IndentWidth: 4 # 缩进 4 空格
TabWidth: 4
UseTab: Never # 禁用Tab,强制空格
# 函数声明与定义
AllowAllParametersOfDeclarationOnNextLine: false # 函数参数是否放在下一行
BinPackParameters: false # 函数参数不压缩到同一行
BinPackArguments: false # 函数调用参数不压缩到同一行
AlwaysBreakAfterReturnType: None # 返回类型与函数名同行
AlignAfterOpenBracket: Align # 参数换行后对齐
ContinuationIndentWidth: 4 # 换行后缩进 4 空格
# 大括号换行规则
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true # class 后换行
AfterFunction: true # 函数后换行
AfterControlStatement: MultiLine # 控制语句后换行(多行时)
SplitEmptyRecord: false
AllowShortBlocksOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false # 禁止单行 if
AllowShortLoopsOnASingleLine: false # 禁止单行循环
# Switch 语句
IndentCaseLabels: true # switch case 缩进一层
# 变量定义
SeparateDefinitionBlocks: Always # 对齐连续变量声明
# 指针/引用格式
DerivePointerAlignment: false # 关闭自动推导
PointerAlignment: Left # 指针符号右贴类型 (int* ptr)
ReferenceAlignment: Left # 引用符号右贴类型 (std::string& str)
SpaceAroundPointerQualifiers: Default #不添加额外空格,限定符紧贴相邻符号
# 命名空间格式化
NamespaceIndentation: All # 命名空间内容缩进
# 空行控制
MaxEmptyLinesToKeep: 1 # 最多保留 1 空行
EmptyLineBeforeAccessModifier: Leave
# ------------------- 水平空格规则 -------------------
SpaceBeforeParens: ControlStatements # 控制语句后加空格 (if ( ... ))
SpaceBeforeRangeBasedForLoopColon: false # 移除冒号前的空格,保持紧凑格式
# 括号内部无空格
SpacesInParentheses: false # 圆括号内无空格(func(1, 2))
SpacesInSquareBrackets: false # 数组括号内无空格(arr[0])
SpacesInAngles: false # 模板尖括号内无空格(vector<int>)
SpacesInContainerLiterals: false # 容器初始化{}内无空格({1, 2})
# 操作符空格规则
SpaceBeforeAssignmentOperators: true # 赋值符两侧加空格(int a = 0)
SpaceAfterLogicalNot: false # 逻辑非后无空格(!condition)
# 三元运算符
SpaceBeforeCpp11BracedList: false # 初始化列表无空格(int x{1})
# 类访问控制顺序
AccessModifierOffset: -4
BreakBeforeInheritanceComma: true #多行继承 逗号在新行行首
# 注释格式化
ReflowComments: true # 自动重排版注释
SpacesInLineCommentPrefix:
Minimum: 1 # 行注释符后 1 空格 (// 内容)
Maximum: 1
SpacesBeforeTrailingComments: 1 # 右置注释前 1 空格
CommentPragmas: '^/*'
# 宏定义格式化
AlignConsecutiveMacros: true # 对齐连续宏定义
# 控制流宏格式化(ASSERT/TEST_CASE 等)
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
- Q_CLASSINFO
- Q_ENUM
- Q_ENUM_NS
- Q_FLAG
- Q_FLAG_NS
- Q_GADGET
- Q_GADGET_EXPORT
- Q_INTERFACES
- Q_LOGGING_CATEGORY
- Q_MOC_INCLUDE
- Q_NAMESPACE
- Q_NAMESPACE_EXPORT
- Q_OBJECT
- Q_PROPERTY
- Q_REVISION
- Q_DISABLE_COPY
- Q_SET_OBJECT_NAME
- QT_BEGIN_NAMESPACE
- QT_END_NAMESPACE
- QML_ADDED_IN_MINOR_VERSION
- QML_ANONYMOUS
- QML_ATTACHED
- QML_DECLARE_TYPE
- QML_DECLARE_TYPEINFO
- QML_ELEMENT
- QML_EXTENDED
- QML_EXTENDED_NAMESPACE
- QML_EXTRA_VERSION
- QML_FOREIGN
- QML_FOREIGN_NAMESPACE
- QML_IMPLEMENTS_INTERFACES
- QML_INTERFACE
- QML_NAMED_ELEMENT
- QML_REMOVED_IN_MINOR_VERSION
- QML_SINGLETON
- QML_UNAVAILABLE
- QML_UNCREATABLE
- QML_VALUE_TYPE