参考资料
- Clang-Format:代码自动格式化(看这一篇就够了)
- Clang-Format Style Options 官方文档
vscode配置步骤
- 安装插件C/C++,最新该插件已经支持clang-format
- 安装插件clang-format,作者是xaver
- 找到clang-lang可执行文件的位置,例如windows下默认位置是C:\Users\用户名.vscode\extensions\ms-vscode.cpptools-1.23.6-win32-x64\LLVM\bin,将该路径加入到path路径中去
- 升级clang-format.exe版本到20.1.0及以上,下载链接
- 将.clang-format文件拷贝到当前工程.vscode/format/文件夹中,没有则新建一个
- 将如下配置写到setting.json文件里
"C_Cpp.clang_format_fallbackStyle": "none",
"C_Cpp.clang_format_style": "file:${workspaceFolder}/.vscode/format/.clang-format",
"[c]": {
"editor.defaultFormatter": "xaver.clang-format"
},
- 重启系统,使配置生效
.clang-format文件典型配置和注释
---
# 支持的语言: None, C, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: C
# 基础格式,未明确指定的风格默认使用基础格式风格
# BasedOnStyle可选范围: LLVM|Google|Chromium|Mozilla|WebKit|Microsoft|GNU
BasedOnStyle: Microsoft
# 访问说明符(public、private等)的偏移,如果等于-4则意味着不缩进
AccessModifierOffset: -2
# 开括号(开圆括号、开尖括号、开方括号)后的对齐,可选范围:
# Align: 在开括号之后对齐变量
# DontAlign:不对齐,换行后使用 ContinuationIndentWidth
# AlwaysBreak: 一行放不下时,总是在一个开括号之后换行
# BlockIndext,一行放不下时,总是在一个开括号之后换行,且在新行关闭尾括号。 仅限于圆括号
AlignAfterOpenBracket: DontAlign
# 当数组的列数相等时,会对齐每行的文本。
# Left: 左对齐
# Right: 右对齐
AlignArrayOfStructures: Left
# 连续赋值时,等号对齐
AlignConsecutiveAssignments:
Enabled: true # 总开关
AcrossEmptyLines: false # 可以跨越空白行进行对齐
AcrossComments: true # 可以跨越注释行进行对齐
AlignCompound: true # 混合运算符+=会对齐于=(仅限于连续赋值)
PadOperators: true # 混合运算符填补对齐到所有左值的最右边边界。(仅限于连续赋值)
# 位域成员对齐
AlignConsecutiveBitFields: true
# 连续声明时,变量名对齐
# 需要注意,这个方法配置最好不要跨过空白行,因为容易把函数定义也给对齐了
AlignConsecutiveDeclarations:
Enabled: true
AcrossEmptyLines: false # 可以跨越空白行进行对齐
AcrossComments: true # 可以跨越注释行进行对齐
# 连续宏定义对齐
# 需要注意,这个方法配置最好不要跨过空白行,因为空白行可以用来做段分割符
AlignConsecutiveMacros:
Enabled: true
AcrossEmptyLines: false
AcrossComments: true
# 对齐分割语法行的斜杠符\
# DontAlign
# Left: 左对齐,是尽可能的向左边对齐
# Right: 右对齐是对齐到列的最右边
AlignEscapedNewlines: Left
# 竖直对齐二元表达式或者三元表达式操作数,即当一行过长时,对齐的方式
# 如果指定 BreakBeforeBinaryOperators 那么操作符也会被换行
# DontAlign
# Align:
# AlignAfterOperators:
AlignOperands: Align
# 对齐连续行尾部的注释
AlignTrailingComments:
Kind: Always # Kind的值可以选择为:Leave(保留不做格式化),Always(对齐尾部注释),Never(不对齐尾部注释,但是应用其他的格式化手段,如缩进)。
OverEmptyLines: 1 # 跨越的空白行数,超过这个行数的注释不会对齐
# 允许函数声明的所有参数在放在下一行
# 如果函数调用或带括号的初始化列表不在一行中,则允许将所有参数放到下一行,即使BinPackArguments为false
AllowAllParametersOfDeclarationOnNextLine: false
# 允许短的块放在同一行,比如 while (true) {};
# Never(从不),Empty(只合并空块),Always(总是合并)
AllowShortBlocksOnASingleLine: Never
# 允许短枚举定义在单行上
AllowShortEnumsOnASingleLine: false
# 允许短的函数放在同一行:
# None: 从不合并函数到单行
# InlineOnly: 仅合并被定义在类里面的短函数,与Inline区别在于不含外部顶级定义的空函数
# Empty: 只合并空函数
# Inline: 合并被定义在类里面的短函数,以及空函数
# ALL: 合并所有合适的短函数在单行上
AllowShortFunctionsOnASingleLine: None
# 允许短的if语句保持在同一行
# Never: 从不
# WithoutElse: 仅在没有else语句时才会把if放在单行上
# OnlyFirstIf: 只把第一个if语句放在单行,后续的else if和else都不会放在单行上
# AllIfsAndElse: 总是把短语句放在单行上
AllowShortIfStatementsOnASingleLine: Never
# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许短匿Lambda函数在单行上
# None: 从不合并
# Empty: 只合并空的Lambda函数
# Inline: 当Lambda函数作为变量时,合并在单行上
# All: 合并所有适合的Lambda表达式在单行上
AllowShortLambdasOnASingleLine: None
# 允许短的循环保持在同一行
# 例如当配置为true时,形式while (true) continue;会被放在单行上。
AllowShortLoopsOnASingleLine: false
# 总是在定义返回类型后换行(该选项已经弃用)
# AlwaysBreakAfterDefinitionReturnType: None
# 函数声明的返回类型换行风格
# None: 在返回类型之后自动断行, PenaltyReturnTypeOnItsOwnLine需要考虑在内。
# All: 总是在返回类型之后断行
# TopLevel: 在顶级函数顶级返回类型处断行
# AllDefinitions: 在函数定义的返回类型处断行
# TopLevelDefinitions: 在顶级函数定义的返回类型处断行
AlwaysBreakAfterReturnType: None
# 总是在多行string字面量前换行,只有当字符串需要换行时,才会生效
AlwaysBreakBeforeMultilineStrings: false
# 总是在template声明后换行
# No: 不会强制在模板声明处断行,需要考虑PenaltyBreakTemplateDeclaration
# MultiLine: 仅在接下来的函数/类声明参数需要跨行时才会在模板处断行
# Yes: 总是在模板声明之后进行断行
AlwaysBreakTemplateDeclarations: No
# 属性宏
# 应该被解释为属性/限定符而不是标识符的字符串向量。这对于语言扩展或静态分析器注释非常有用
# 例如代码如下:
# x = (char *__capability)&y;
# int function(void) __ununsed;
# void only_writes_to_buffer(char *__output buffer);
# 配置如下,两种形式皆可
# AttributeMacros: ['__capability', '__output', '__ununsed']
# AttributeMacros:
# - __capability
# - __output
# - __ununsed
# 装箱变量,用于处理当函数的入参的长度过长时,多个入参的换行策略
# 如果为false,函数调用变量要么都在同一行上,要么每个变量都独自在一行
# 如果true,则会把变量合理打包放在一行上,显得更紧凑。
BinPackArguments: true
# 位域成员的空白风格
# Both: 在:号每边都增加一个空白。
# None: 不加任何空白,除了AlignConsecutiveBitFields需要之外。
# Before: 仅在:号之前添加空白。
# After: 仅在:之后添加空白,除了AlignConsecutiveBitFields需要在前面添加空白之外。
BitFieldColonSpacing: Both
# 大括号换行风格
# 如果 breakbeforebraces 设置为 Custom ,则使用它来指定应该如何处理每个独立的大括号情况。否则,它将被忽略。
BraceWrapping:
AfterCaseLabel: false # 对case后面的大括号换行
AfterClass: false # 对class定义后面
AfterControlStatement: false # 对语句if/for/while/switch/...的换行风格控制
AfterEnum: false # enum定义后面
AfterFunction: true # 函数定义后面
AfterNamespace: false # 命名空间定义后面
AfterObjCDeclaration: false # ObjC定义后面
AfterStruct: false # struct定义后面
AfterUnion: false # union定义后面
AfterExternBlock: false # extern声明之后,比如extern "C" {}
BeforeCatch: false # catch之前
BeforeElse: false # else之前
BeforeLambdaBody: false # 在Lambda表达式块之前换行
BeforeWhile: false # 在while之前换行
IndentBraces: false # 是否对换行的大括号缩进
# 如果为false,空函数体可以放在单行上。此选项仅在函数的左大括号已经被换行的情况下使用
# 即设置了AfterFunction大括号换行模式,并且函数不应该放在单行上(根据AllowShortFunctionsOnASingleLine和构造函数格式选项)。
SplitEmptyFunction: true
# 如果为false,空记录(例如类、结构或联合)主体可以放在单行上。此选项仅在记录的开始大括号已经被换行的情况下使用,即设置了AfterClass(用于类)大括号换行模式。
SplitEmptyRecord: true
# 如果为false,空的namespace主体可以放在单行上。此选项仅在命名空间的开始大括号已经被换行的情况下使用,即设置了AfterNamespace大括号换行模式。
SplitEmptyNamespace: true
# 在修饰器之后断行
# BreakAfterJavaFieldAnnotations: true
# Json数组断行
# 如果为true, clang-format将总是在Json数组之后断行,否则它将扫描到结束,以确定是否应该在元素之间添加换行符(兼容更漂亮的格式)
# BreakArrays: false
# 在二元运算符前换行,用于确定换行时 + - * / || && 等符号的位置
# None(在操作符后换行)
# NonAssignment(在非赋值的操作符前换行)
# All(在操作符前换行)
BreakBeforeBinaryOperators: None
# 在大括号前换行风格:
# Attach 始终将大括号附加到周围的上下文
# Linux 和Attach类似,但是会在函数、命名空间namespace和类定义之前换行
# Mozilla 和Attach类似,但是会在枚举、函数、record定义之前换行
# Stroustrup 和Attach类似,但是在函数定义、catch、else之前换行
# Allman 总是会在大括号之前断行
# Whitesmiths 和Allman类似,但是始终要缩进大括号并使用大括号排列代码
# GNU 总是在大括号之前断行,并在控制语句的大括号中增加额外的缩进级别,而在类、函数或其他定义的大括号中不会缩进大括号
# WebKit 和Attach类似,但是在函数之前断行
# Custom 自定义
# 注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 概念声明断行风格
# Never保持模板声明行和concept在一起。
# Allowed允许在模板声明和concept之间断行,实际的表现取决于上下文和断行规则。
# Always永远在concept之前断行,并且将该行放在模板声明之前
# BreakBeforeConceptDeclarations:
# 三元操作符断行规则
# 如果为true,三元操作符将放在换行符之后。
BreakBeforeTernaryOperators: false
# 在构造函数的初始化列表的逗号前换行
# BeforeColon 断行冒号前和逗号后的构造函数初始化式
# BeforeComma 在冒号和逗号之前断行构造函数的初始化式,并将逗号与冒号对齐
# AfterColon 在冒号和逗号后面断行构造函数初始化式
# BreakConstructorInitializers: BeforeColon
# 继承链断行风格
# BeforeColon 在冒号之前,逗号之后断行继承链。
# BeforeComma 在冒号和逗号之前断行,并且对齐它们
# AfterColon 在冒号和逗号之后断行
# AfterComma 仅在逗号之后进行断行
# BreakInheritanceList: BeforeColon
# 字符串常量断行
BreakStringLiterals: true
# 每行字符的限制,0表示没有限制
ColumnLimit: 160
# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变,符合条件的行不会被分行
# CommentPragmas: '^ IWYU pragma:'
# 紧凑命名空间
# 如果为true,则连续的名称空间声明将在同一行上。如果为false,则每个名称空间都在新行中声明,如果一行放不下,那么就会换行。
# CompactNamespaces: false
# 构造函数的初始化列表要么都在同一行,要么都各自一行
# 选项已弃用, 参见 CurrentLine of PackConstructorInitializers
# ConstructorInitializerAllOnOneLineOrOnePerLine: false
# 构造函数的初始化列表的缩进宽度
# ConstructorInitializerIndentWidth: 4
# 延续的行的缩进宽度
ContinuationIndentWidth: 4
# 去除C++11的列表初始化的大括号{后和}前的空格
# Cpp11BracedListStyle: false
# 提取行结尾
# 分析格式化文件中最常用的行结尾(\r\n或\n)。UseCRLF仅在无法派生任何方法时用作备用。
# DeriveLineEnding:
# 继承最常用的指针和引用的对齐方式
# DerivePointerAlignment: false
# 关闭格式化功能
DisableFormat: false
# 访问修饰符后空行,定义何时在访问修饰符之后放置空行。EmptyLineBeforeAccessModifier配置处理两个访问修饰符之间的空行数
# Never: 移除访问修饰符之后所有的空行。
# Leave: 在访问修饰符之后保持现有的空行。取而代之的是MaxEmptyLinesToKeep。
# Always: 如果没有访问修饰符,总是在后面添加空行。MaxEmptyLinesToKeep也被应用。
# EmptyLineAfterAccessModifier: Never
# 访问修饰符前空行
# Never: 移除访问修饰符之前的所有空行。
# leave: 保留在访问符之间的空行。
# LogicalBlock: 只有当访问修饰符开始一个新的逻辑块时才添加空行。逻辑块是由一个或多个成员字段或函数组成的一组。
# Always: 总是在访问修饰符之前添加空行,除非访问修饰符位于结构或类定义的开头
# EmptyLineBeforeAccessModifier: Never
# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
# 如果为true, clang-format将检测函数调用和定义是否使用每行一个参数进行格式化。
# 注意:这是一个实验标志,它可能会消失或被重命名。不要在配置文件中使用它,等等。使用风险自负
# ExperimentalAutoDetectBinPacking: false
# 修复命名空间描述
# 如果为true, clang-format将为短名称空间添加丢失的“名称空间的结束注释”并修复无效的现有注释。短命名空间的换行风格由“ShortNamespaceLines”控制。
# FixNamespaceComments: false
# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros: [ foreach, FOREACH, Q_FOREACH, BOOST_FOREACH ]
# include块风格
# Preserve: 每个#include块单独排序。
# Merge: 合并多个#include块,并且整体排序。
# Regroup: 合并多个#include块,并且整体排序,然后根据类别优先级分组,可查询IncludeCategories。
IncludeBlocks: Merge
# 将include按一定的规则进行分组,方便自动排序
# 对#include进行排序,匹配了某正则表达式的#include拥有对应的优先级,匹配不到的则默认优先级为INT_MAX(优先级越小排序越靠前),
# 可以定义负数优先级从而保证某些#include永远在最前面
# IncludeCategories:
# - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
# Priority: 2
# - Regex: '^(<|"(gtest|isl|json)/)'
# Priority: 3
# - Regex: '.*'
# Priority: 1
# 判断主包含的正则表达式,指定一个正则表达式,其表明了文件到主包含映射中被允许的后缀名。
# IncludeIsMainRegex:
# 判断源文件的正则表达式
# 默认情况下,clang-format认为只有当文件以.c, .cc, .cpp, .c++, .cxx, .m或.mm扩展名结尾时,文件才是" main"。
# 对于这些文件,将进行“main”include的猜测(分配类别0,参见上面)。该配置选项允许为被视为“main”的文件添加额外的后缀和扩展名
# IncludeIsMainSourceRegex:
# 访问修饰符缩进,指定访问修饰符是否应该有自己的缩进级别
# 当为false时,访问修饰符相对于记录成员缩进(或向外缩进),根据AccessModifierOffset。记录成员的缩进位置比记录低一级。
# 当为true时,访问修饰符获得自己的缩进级别。
# 因此,无论是否存在访问修饰符,记录成员总是在记录下方缩进2级。AccessModifierOffset的值被忽略。
# IndentAccessModifiers: true
# 缩进case标签
# 当为false时,case和switch语句同级,不缩进
# 当为true时,case语句也缩进
IndentCaseLabels: true
# Extern扩展块缩进策略
# AfterExternBlock: 向后兼容AfterExternBlock的缩进,即按BraceWrapping.AfterExternBlock设置来进行格式化。
# NoIndent: 不缩进extern扩展块
# Indent: 缩进extern扩展块
IndentExternBlock: Indent
# 是否缩进Goto跳转符号
IndentGotoLabels: false
# 预处理指令缩进风格
# None: 不缩进任何预处理器指示符。
# AfterHash: #符号不缩进,但后面的内容缩进。
# BeforeHash: 整条语句都缩进
IndentPPDirectives: None
# 缩进要求子句(C++)
# 缩进模板中的require子句。这只适用于RequiresClausePosition为OwnLine或WithFollowing时
# IndentRequiresClause: true
# 缩进宽度
IndentWidth: 4
# 函数名缩进,函数返回类型换行时,缩进函数声明或函数定义的函数名
# true: 超长时,函数返回类型和函数之间有缩进
# false: 不缩进函数返回类型和函数本身
IndentWrappedFunctionNames: false
# 主动插入括号
# 在c++中,在控制语句(if、else、for、do和while)后面插入大括号,除非控制语句在宏定义中,或者大括号包含预处理程序指令
# 将此选项设置为true可能导致错误的代码格式,因为clang-format缺乏完整的语义信息。因此,在检查此选项所做的代码更改时应格外小心
InsertBraces: false
# 保留在块开始处的空行,比如强制在if语句后加一个空行
KeepEmptyLinesAtTheStartOfBlocks: false
# 开始一个块的宏的正则表达式
# MacroBlockBegin: ''
# 结束一个块的宏的正则表达式
# MacroBlockEnd: ''
# 连续空行的最大数量,如果等于0说明不允许有空行
MaxEmptyLinesToKeep: 1
# 命名空间的缩进(C++)
# None(不缩进), Inner(缩进嵌套的命名空间中的内容), All(缩进所有的命名空间)
# NamespaceIndentation: ALL
# 使用ObjC块时缩进宽度(C++)
# ObjCBlockIndentWidth: 4
# 在ObjC的@property后添加一个空格(C++)
# ObjCSpaceAfterProperty: false
# 在ObjC的protocol列表前添加一个空格(C++)
# ObjCSpaceBeforeProtocolList: true
# 在call(后对函数调用换行的penalty(C++)
# PenaltyBreakBeforeFirstCallParameter: 19
# 在一个注释中引入换行的penalty
# PenaltyBreakComment: 300
# 第一次在<<前换行的penalty
# PenaltyBreakFirstLessLess: 120
# 在一个字符串字面量中引入换行的penalty
# PenaltyBreakString: 1000
# 对于每个在行字符数限制之外的字符的penalty
# PenaltyExcessCharacter: 1000000
# 将函数的返回类型放到它自己的行的penalty
# PenaltyReturnTypeOnItsOwnLine: 60
# 指针和引用的对齐: Left(*靠近类型), Right(*靠近变量), Middle(*在中间,两边有空格)
PointerAlignment: Right
# 限定符对齐,不同的排列说明符和限定符的方法(例如const/volatile)。
# Leave: 保持原状,不强制左或右对齐
# Left: 左对齐说明符和限定符
# Right: 右对齐说明符和限定符
# Custom: 将说明符/限定符更改为基于QualifierOrder对齐
QualifierAlignment: Left
# 说明/限定符顺序
# 限定符出现的顺序。Order是一个数组,可以包含以下任何一个:
# const, inline, static, constexpr, volatile, restrict, type
# 注意:它必须包含’ type ‘。在’ type '左边的项目将被放置在类型的左边,并按提供的顺序排列。“类型”右侧的项目将被放置在类型的右侧,并按提供的顺序排列。
# QualifierOrder: ['inline', 'static', 'type', 'const', 'volatile' ]
# 原始字符串格式,定义在原始字符串中检测支持的语言代码块的提示。
# 具有匹配分隔符或匹配封闭函数名的原始字符串将根据.clang-format文件中定义的指定语言的样式进行重新格式化。
# 如果在.clang- format文件中没有为特定语言定义样式,则使用BasedOnStyle 给出的预定义样式。
# 如果没有找到BasedOnStyle ,则格式化基于llvm样式。在确定原始字符串内容的语言时,匹配的分隔符优先于匹配的封闭函数名。
# 如果指定了规范分隔符,则同一语言中出现的其他分隔符将尽可能更新为规范分隔符。
# 每种语言最多应该有一个规范,每个分隔符和封闭函数不应该出现在多个规范中。
# RawStringFormats:
# - Language: TextProto
# Delimiters:
# - 'pb'
# - 'proto'
# EnclosingFunctions:
# - 'PARSE_TEXT_PROTO'
# BasedOnStyle: google
# - Language: Cpp
# Delimiters:
# - 'cc'
# - 'cpp'
# BasedOnStyle: llvm
# CanonicalDelimiter: 'cc'
# 引用对齐格式,也就是&符号的对齐方式
# ReferenceAlignment: Right
# 允许重新排版注释,比如注释超长了会自动换行
ReflowComments: false
# 移除括号,比如if后面就一条语句时,删除括号
# 该选项可能带来未知的错误,需要小心使用
RemoveBracesLLVM: false
# 移除非空函数的分号
RemoveSemicolon: false
# 主动添加空行分隔定义块,包括类、结构、枚举和函数
# Leave: 保留原来的样子不变。
# Always: 在定义块之间插入空行。
# Never: 在定义块之间移除空行。
SeparateDefinitionBlocks: Always
# 允许排序#include
# Never,不对include进行排序
# CaseSensitive,包含以ascii或区分大小写的方式进行排序
# CaseInsensitive,包含以字母或不区分大小写的方式排序
SortIncludes: Never
# 在C风格类型类型强制转换后添加空格
# 例如(int) i;
SpaceAfterCStyleCast: false
# 是否在逻辑!操作符后面插入空白符
SpaceAfterLogicalNot: false
# 定义在何种情况下在指针限定符之前或之后放置空格
# Default不用确保指针限定符周围的空格,而是使用PointerAlignment代替
# Before确保在指针限定符之前有一个空格
# After确保在指针限定符之后有一个空格
# Both确保在指针限定符之后和之前都有一个空格
SpaceAroundPointerQualifiers: Default
# 在赋值运算符之前添加空格
# 例如在+=之前添加空格
SpaceBeforeAssignmentOperators: true
# 是否在case语句的冒号前添加空格
SpaceBeforeCaseColon: true
# 是否在圆括号之前添加一个空格
# Never: 从不在一个开圆括号之前放一个空格
# ControlStatement: 只在控制语句关键字(for/if/while…)之后的开括号前加空格
# ControlStatementsExceptControlMacros: 和ControlStatement类似,但是排除控制宏定义,例如ForEach宏等。在这种情况下,ForEach宏被当成函数调用
# NonEmptyParentheses: 只有当圆括号不是空的时候,才在圆括号前放空格
# Always: 总是在开括号之前放一个空格,除非语法规则禁止这样做(在函数类宏定义中),或者由其他样式规则决定(在一元运算符、开括号之后等)
# Custom: 在SpaceBeforeParensOptions中独立配置不同情况下的括号前空格
SpaceBeforeParens: ControlStatements
# 如果SpaceBeforeParens被设置为自定义,那么使用它来指定如何处理括号前的每个空格。否则,它将被忽略
# 可选范围:
# bool AfterControlStatements,在控制语句for/if/while...关键字和开圆括号之间放置空格
# bool AfterForeachMacros,在foreach宏和开圆括号之间放置空格
# bool AfterFunctionDeclarationName,在函数声明和开圆括号之前放置空格
# bool AfterFunctionDefinitionName,在函数定义名称和左括号之间用空格隔开
# bool AfterIfMacros,在if宏和左括号之间放空格
# bool AfterOverloadedOperator,在操作符重载和开括号之间放一个空格
# bool AfterRequiresInClause,在required子句中的required关键字和开括号(如果有的话)之间放空格
# bool AfterRequiresInExpression,在required表达式中的required关键字和开括号之间放空格
# bool BeforeNonEmptyParentheses,只有当圆括号不是空的时候,才在圆括号前放空格
#SpaceBeforeParensOptions:
# AfterControlStatements: true
# AfterFunctionDefinitionName: true
# 是否在空的代码块中加空格,即大括号之间
# 例如 void foo { }
SpaceBeforeSquareBrackets: false
# 在空的圆括号中添加空格
SpaceInEmptyParentheses: false
# 在尾随的注释前添加的空格数,即在语句和//前加几个空格
SpacesBeforeTrailingComments: 1
# 在尖括号的<后和>前添加空格
SpacesInAngles: false
# 在容器(ObjC和JavaScript的数组和字典等)字面量中添加空格
# SpacesInContainerLiterals: false
# 条件表达式中的空白,如果为true,将在If /for/switch/while条件周围插入空格
SpacesInConditionalStatement: false
# 行注释的开头允许有多少空格。要禁用最大值,请将其设置为-1,除此之外,最大值优先于最小值
# TODO: 未生效?
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
# 在C风格类型转换的括号中添加空格
SpacesInCStyleCastParentheses: false
# 在圆括号的(后和)前添加空格
SpacesInParentheses: false
# 在方括号的[后和]前添加空格,lamda表达式和未指明大小的数组的声明不受影响
SpacesInSquareBrackets: false
# C++标准
# c++03,解析和格式化为c++03。Cpp03是c++03已弃用的别名
# c++11,解析和格式化为c++11。
# c++14,解析和格式化为c++14。
# c++17,解析和格式化为c++17。
# c++20,解析和格式化为c++20。
# Latest,解析和格式化为最新的支持版本。
# Auto,根据输入和输出自动检测语言。
# Standard: Cpp11
# 应该被解释为完整语句的宏向量。
# 典型的宏是表达式,需要添加分号; 有时情况并非如此,这允许clang-format意识到这种情况
# StatementMacros: []
# tab宽度
TabWidth: 4
# 应该被解释为类型声明而不是函数调用的宏向量
# TypenameMacros: []
# 使用tab字符
# Never,从不使用tab。
# ForIndentation,仅用于缩进。
# ForContinuationAndIndentation,用制表符填充所有前导空白,并使用空格对齐出现在一行内(例如连续赋值和声明)。
# AlignWithSpaces,使用制表符进行行继续和缩进,使用空格进行对齐。
# Always,每当需要填充至少跨越一个制表位到下一个制表位的空白时,就使用制表符。
UseTab: Never
# 换行时使用\r\n而不是\n。如果DeriveLineEnding为真,也可用作回退。
UseCRLF: false
# 定义对空白敏感且不应被触及的宏向量,可以在这里添加白名单
# WhitespaceSensitiveMacros: []