QtCreator 自定义Clang-format

113 阅读4分钟

官网
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

image.png

不需要格式化整个文件, 只需要格式化选中部分(快捷键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