1. Install Clang-Format
Install the Clang-Format plugin in vscode
2. Install Clang-Format in the system
sudo apt-get install clang-format
3. Generate Clang-Format file
// Format name optional: LLVM, Google, Chromium, Mozilla, WebKit.
clang-format -style=format name -dump-config > .clang-format
A Google standard file, put it in .clang-format, and put the .clang-format file in the project
---
Language: Cpp
# BasedOnStyle: Google # 基于Google样式指南
# 访问修饰符(public, private, protected)相对于基本缩进的偏移量
AccessModifierOffset: -1
# 对齐括号后的参数列表
AlignAfterOpenBracket: Align
# 不对齐连续的宏定义
AlignConsecutiveMacros: false
# 不对齐连续的赋值语句
AlignConsecutiveAssignments: false
# 不对齐连续的声明语句
AlignConsecutiveDeclarations: false
# 对齐反斜杠换行的连续行
AlignEscapedNewlines: Left
# 对齐运算符两侧的操作数
AlignOperands: true
# 对齐尾随注释
AlignTrailingComments: true
# 允许所有参数在下一行
AllowAllArgumentsOnNextLine: true
# 允许所有构造函数初始化列表在下一行
AllowAllConstructorInitializersOnNextLine: true
# 允许所有声明的参数在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# 不允许将短的代码块放在单行
AllowShortBlocksOnASingleLine: Never
# 不允许将短的case标签放在单行
AllowShortCaseLabelsOnASingleLine: false
# 允许将所有短函数放在单行
AllowShortFunctionsOnASingleLine: All
# 允许将所有短Lambda表达式放在单行
AllowShortLambdasOnASingleLine: All
# 允许将没有else的短if语句放在单行
AllowShortIfStatementsOnASingleLine: WithoutElse
# 允许将短循环放在单行
AllowShortLoopsOnASingleLine: true
# 在定义返回类型后不强制换行
AlwaysBreakAfterDefinitionReturnType: None
# 在返回类型后不强制换行
AlwaysBreakAfterReturnType: None
# 在多行字符串之前始终换行
AlwaysBreakBeforeMultilineStrings: true
# 总是在模板声明处换行
AlwaysBreakTemplateDeclarations: Yes
# 将函数调用的参数尽可能多地放在同一行
BinPackArguments: true
# 将函数声明的参数尽可能多地放在同一行
BinPackParameters: true
# 大括号换行设置
BraceWrapping:
# case标签后的大括号不另起一行
AfterCaseLabel: true
# 类声明后的大括号不另起一行
AfterClass: true
# 控制语句后的大括号不另起一行
AfterControlStatement: true
# 枚举声明后的大括号不另起一行
AfterEnum: true
# 函数声明后的大括号不另起一行
AfterFunction: true
# 命名空间声明后的大括号不另起一行
AfterNamespace: true
# Objective-C声明后的大括号不另起一行
AfterObjCDeclaration: true
# 结构体声明后的大括号不另起一行
AfterStruct: true
# union声明后的大括号不另起一行
AfterUnion: true
# 外部块声明后的大括号不另起一行
AfterExternBlock: true
# catch关键字前的大括号不另起一行
BeforeCatch: true
# else关键字前的大括号不另起一行
BeforeElse: true
# 不对大括号进行缩进
IndentBraces: false
# 空函数的大括号分开
SplitEmptyFunction: true
# 空记录(类、结构体、联合体)的大括号分开
SplitEmptyRecord: true
# 空命名空间的大括号分开
SplitEmptyNamespace: true
# 二元操作符前不换行
BreakBeforeBinaryOperators: None
# 大括号附加在控制语句、函数等同一行
# 在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义,与Attach类似),
# Mozilla(除枚举、函数、记录定义,与Attach类似), Stroustrup(除函数定义、catch、else,与Attach类似),
# Allman(总是在大括号前换行), GNU(总是在大括号前换行,并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
# 注:这里认为语句块也属于函数
BreakBeforeBraces: Custom
# 继承列表中的逗号前不换行
BreakBeforeInheritanceComma: false
# 继承列表在冒号前换行
BreakInheritanceList: BeforeColon
# 三元操作符前换行
BreakBeforeTernaryOperators: true
# 构造函数初始化列表中的逗号前不换行
BreakConstructorInitializersBeforeComma: false
# 构造函数初始化列表在冒号前换行
BreakConstructorInitializers: BeforeColon
# Java字段注解后不换行
BreakAfterJavaFieldAnnotations: false
# 字符串字面量在需要时换行
BreakStringLiterals: true
# 每行最大字符数限制为80
ColumnLimit: 80
# 特定注释格式的正则表达式匹配
CommentPragmas: '^ IWYU pragma:'
# 命名空间内容不紧凑排列
CompactNamespaces: false
# 构造函数初始化列表要么全部在一行,要么每个成员一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 构造函数初始化列表的缩进宽度为4个空格
ConstructorInitializerIndentWidth: 4
# 换行后的续行缩进宽度为4个
ContinuationIndentWidth: 4
# 使用C++11风格的花括号列表格式,即在初始化列表中,每个元素后都跟一个逗号
Cpp11BracedListStyle: true
# 自动推断换行符风格,如Windows(\r\n)或Unix(\n)等
DeriveLineEnding: true
# 自动推断指针对齐风格,如左对齐(Type *var)或右对齐(Type* var)等
DerivePointerAlignment: true
# 不禁用格式化,即允许格式化操作
DisableFormat: false
# 不使用实验性的自动检测二进制打包功能。这个选项仅用于尝试自动检测是否启用二进制参数包装
ExperimentalAutoDetectBinPacking: false
# 修复命名空间注释,使其与命名空间对齐并以一致的风格显示
FixNamespaceComments: true
# 自定义支持的foreach宏,这些宏将被识别为循环并进行适当的缩进
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
# 将#include指令按分类重新组织。在这种模式下,相同类别的#include指令将聚集在一起,并用空行分隔
IncludeBlocks: Regroup
# 指定#include指令的分类和排序优先级,使用正则表达式匹配。
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
- Regex: '^<.*'
Priority: 2
SortPriority: 0
- Regex: '.*'
Priority: 3
SortPriority: 0
# 指定main文件的正则表达式,用于确定文件中是否包含主要的#include指令
IncludeIsMainRegex: '([-_](test|unittest))?$'
# 指定main源文件的正则表达式。当未指定时,使用IncludeIsMainRegex匹配
IncludeIsMainSourceRegex: ''
# 缩进case标签,使其与所属的switch语句内部代码对齐
IndentCaseLabels: true
# 缩进goto标签,使其与所属的控制流程代码对齐
IndentGotoLabels: true
# 预处理器指令不缩进
IndentPPDirectives: None
# 缩进宽度为2个空格
IndentWidth: 2
# 不缩进换行后的函数名
IndentWrappedFunctionNames: false
# 保留JavaScript中的引号风格(单引号或双引号)
JavaScriptQuotes: Leave
# 将JavaScript导入语句换行
JavaScriptWrapImports: true
# 在块的开始处不保留空行
KeepEmptyLinesAtTheStartOfBlocks: false
# 定义用于标记宏块开始的字符串。为空时,不使用宏块特性
MacroBlockBegin: ''
# 定义用于标记宏块结束的字符串。为空时,不使用宏块特性
MacroBlockEnd: ''
# 保留的最大连续空行数为1
MaxEmptyLinesToKeep: 1
# 命名空间内部的内容不进行缩进
NamespaceIndentation: None
# Objective-C协议列表不进行二进制打包
ObjCBinPackProtocolList: Never
# Objective-C块的缩进宽度为2个空格
ObjCBlockIndentWidth: 2
# Objective-C属性后不添加空格
ObjCSpaceAfterProperty: false
# Objective-C协议列表前添加空格
ObjCSpaceBeforeProtocolList: true
# 赋值操作符换行的惩罚值为2
PenaltyBreakAssignment: 2
# 函数调用参数列表的第一个参数前换行的惩罚值为1
PenaltyBreakBeforeFirstCallParameter: 1
# 注释换行的惩罚值为300
PenaltyBreakComment: 300
# 在C++的左移操作符(<<)前换行的惩罚值为120
PenaltyBreakFirstLessLess: 120
# 字符串换行的惩罚值为1000
PenaltyBreakString: 1000
# 模板声明换行的惩罚值为10
PenaltyBreakTemplateDeclaration: 10
# 每个超出列限制的字符的惩罚值为1000000
PenaltyExcessCharacter: 1000000
# 返回类型独占一行的惩罚值为200
PenaltyReturnTypeOnItsOwnLine: 200
# 指针对齐方式为左对齐,即“Type *var”
PointerAlignment: Left
# 原始字符串格式设置,用于不同语言和定界符
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: '' # 规范定界符为空字符串。
BasedOnStyle: google # 基于Google样式指南。
- Language: TextProto
Delimiters:
- pb
- PB
- proto
- PROTO
EnclosingFunctions: # 包含原始字符串的函数列表。
- EqualsProto
- EquivToProto
- PARSE_PARTIAL_TEXT_PROTO
- PARSE_TEST_PROTO
- PARSE_TEXT_PROTO
- ParseTextOrDie
- ParseTextProtoOrDie
CanonicalDelimiter: '' # 规范定界符为空字符串。
BasedOnStyle: google # 基于Google样式指南。
# 重新排列注释以适应列限制
ReflowComments: true
# 对#include指令进行排序
SortIncludes: true
# 对using声明进行排序
SortUsingDeclarations: true
# C风格类型转换后不添加空格
SpaceAfterCStyleCast: false
# 逻辑非操作符后不添加空格
SpaceAfterLogicalNot: false
# 模板关键字后添加空格
SpaceAfterTemplateKeyword: true
# 赋值操作符前添加空格
SpaceBeforeAssignmentOperators: true
# C++11花括号列表前不添加空格
SpaceBeforeCpp11BracedList: false
# 构造函数初始化列表的冒号前添加空格
SpaceBeforeCtorInitializerColon: true
# 继承列表的冒号前添加空格
SpaceBeforeInheritanceColon: true
# 控制语句的圆括号前添加空格
SpaceBeforeParens: ControlStatements
# 基于范围的for循环的冒号前添加空格
SpaceBeforeRangeBasedForLoopColon: true
# 空块中不添加空格
SpaceInEmptyBlock: false
# 空圆括号中不添加空格
SpaceInEmptyParentheses: false
# 尾部注释前添加2个空格
SpacesBeforeTrailingComments: 2
# 尖括号中不添加空格
SpacesInAngles: false
# 条件语句中不添加空格
SpacesInConditionalStatement: false
# 容器字面量中添加空格
SpacesInContainerLiterals: true
# C风格类型转换的圆括号中不添加空格
SpacesInCStyleCastParentheses: false
# 圆括号中不添加空格
SpacesInParentheses: false
# 方括号中不添加空格
SpacesInSquareBrackets: false
# 方括号前不添加空格
SpaceBeforeSquareBrackets: false
# 自动检测使用的C++标准(如C++11、C++14等)
Standard: Auto
# 语句宏列表,这些宏将被视为单个语句并进行适当的缩进
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
# 制表符宽度为8个空格
TabWidth: 8
# 使用Unix风格的换行符(\n),而非Windows风格的换行符(\r\n)
UseCRLF: false
# 永远不使用制表符进行缩进
UseTab: Never
4. Enable
ctrl+shift+i