.clang-format配置语法

xuweihui / 2023-07-16 / 原文

官网:Clang格式样式选项 — Clang 17.0.0git 文档 (llvm.org)
https://clang.llvm.org/docs/ClangFormatStyleOptions.html
有人翻译后转载了
Clang-Format Style Options[翻译] - 简书 (jianshu.com)
https://www.jianshu.com/p/5dea6bdbbabb
 
用法举例:

注意冒号后面要有一个空格 

至于如何使用,自己搜,这个容易搜:如使用 clang-format 进行 C++ 代码风格管理 - 知乎 (zhihu.com)

https://zhuanlan.zhihu.com/p/514541589

 

下面是本人根据文档,按空格、对齐、换行、缩进分类设置了自己喜欢的风格的效果图和代码,给同样喜欢的有缘人

 .clang-format:

---
# BaseOnStyle: llvm
# BaseOnStyle: Chromium
# BaseOnStyle: Google
# BaseOnStyle: Mozilla
# BaseOnStyle: WebKit
# BaseOnStyle: Microsoft
BaseOnStyle: GNU
# BaseOnStyle: Visual Studio
# BaseOnStyle: 
# BaseOnStyle: 
# BaseOnStyle: 
# Language: Cpp


#空格
# 花括号列表内是否没有空格
Cpp11BracedListStyle: true
# Cpp11BracedListStyle: false
# 在@property后加空格
ObjCSpaceAfterProperty: false
# 类型转换后插入空格
SpaceAfterCStyleCast: false
# =前移除空格
SpaceBeforeAssignmentOperators: false
# 在用于初始化对象的C ++ 11括号列表之前插入空格
SpaceBeforeCpp11BracedList: false
# 在构造函数初始化器冒号之前将删除空格
SpaceBeforeCtorInitializerColon: false
# 如果为false,则在继承冒号之前将删除空格。
SpaceBeforeInheritanceColon: false
# 在左括号前插入空格的情况,
# Never 永远不会在左括号前插入空格
#ControlStatements 在控制语句关键字(for / if / while ...)之后的左括号前插入一个空格
#Always 总是在左括号前插入一个空格
SpaceBeforeParens: Never
# 如果为false,在基于范围的for循环冒号之前将删除空格
SpaceBeforeRangeBasedForLoopColon: false
# 如果为true,则可以在()中插入空格。
SpaceInEmptyParentheses: false
# 尾随行注释(//)之前的空格数
SpacesBeforeTrailingComments: 0
# 如果为true,则会在模板参数列表中的<之后和>之前插入空格
SpacesInAngles: false
# 如果为true,则可以将空格插入到C语言样式的类型转换中。
SpacesInCStyleCastParentheses: false
# 如果为true,则在字面量容器内插入空格(例如ObjC和JavaScript里的array和dict)
SpacesInContainerLiterals: false
# 如果为true,则在'('之后,')'之前插入空格。
SpacesInParentheses: false
# 如果为true,则在"["之后,"]"之前插入空格, Lambdas或未指定大小的数组声明不会受到影响。
SpacesInSquareBrackets: false



# 对齐
# 如果设置了这个选项,则在左括号后进行水平对齐
# 这同样适用于圆括号,尖括号,方括号,() <> []
# 换行规则根据最大代码列数ColumnLimit来判断
# BAlign 对齐括号里的参数
# DontAlign 不对齐,而是使用缩进ContinuationIndentWidth对齐,比如ContinuationIndentWidth=4
# AlwaysBreak 如果参数不适合单行,则在左括号后换行
AlignAfterOpenBracket: Align
# 如果为true,则对齐连续行的赋值操作符
AlignConsecutiveAssignments: true
# 如果为true,则对齐连续行的声明的变量
AlignConsecutiveDeclarations: true
# 用于在转义换行符中对齐反斜杠的选项
# DontAlign 不对齐反斜杠
# Left 尽可能的远的对齐反斜杠
# Right 在最大列处对齐反斜杠
AlignEscapedNewlines: Left
# 如果为true,则水平对齐二元或三元表达式
# 具体来说,这将对齐需要拆分成多行的单行表达式
AlignOperands: true
# 如果为ture,则对齐注释
AlignTrailingComments: true
# 指针*对齐样式 Left Right Middle
PointerAlignment: Left
# 换行
# 如果函数不适合一行展示,将函数的所有参数放到下一行,即使BinPackParameters为false
AllowAllParametersOfDeclarationOnNextLine: false
# 函数中,返回声明的样式
# ps:一般设置None,因为返回值声明后需要换行很少见
# None 意味着不换行  All 返回值声明后总是要换行
# TopLevel 总是在全局函数声明的返回值后换行
# AllDefinitions 总是在实现的函数返回值定义处换行
# TopLevelDefinitions 总是在全局函数里的已实现函数的返回值处换行
AlwaysBreakAfterReturnType: None
# 如果为true,则在多行定义字符串之前换行
AlwaysBreakBeforeMultilineStrings: false
# 要使用的模板声明中的换行样式
# No 在声明之前不强制换行
# MultiLine 仅在以下声明跨越多行时才强制在模板声明之后换行
# Yes 总是在模板声明后换行
AlwaysBreakTemplateDeclarations: No
# 控制着花括号的样式
BreakBeforeBraces: Custom
# 控制着花括号的样式 如果想要这个选项生效,必须将BreakBeforeBraces设置为Custom
BraceWrapping:
# AfterClass 决定类定义处换行
  AfterClass: false
  # AfterControlStatement决定在(if/for/while/switch/@autoreleasepool/@synchronized..)处换行
  AfterControlStatement: false
  # AfterEnum决定在枚举定义处换行
  AfterEnum: false
  # AfterFunction决定在方法定义处换行
  AfterFunction: false
  # AfterNamespace决定在命名空间定义处换行
  AfterNamespace: false
  # AfterObjCDeclaration决定在ObjC定义处(interfaces,implementations)是否换行
  AfterObjCDeclaration: false
  # AfterStruct决定在结构体定义处是否换行
  AfterStruct: false
  # AfterUnion决定在联合体定义处是否换行
  AfterUnion: false
  # AfterExternBlock决定在extern处是否换行
  AfterExternBlock: false
  # BeforeCatch决定在try-catch的catch前是否换行
  BeforeCatch: false
  # BeforeElse决定在else前是否换行
  BeforeElse: false
  # IndentBraces花括号自身缩进
  IndentBraces: false
  # 如果值为false,那么空函数体可以放在一行;如果想要值为false时生效,必须使AfterFunction为true并且AllowShortFunctionsOnASingleLine为None
  SplitEmptyFunction: false
  # SplitEmptyRecord如果为false,则可以将例如class/struct/union空实现放入单独一行;如果想要值为false时生效,必须使AfterClass为true
  SplitEmptyRecord: false
  # SplitEmptyNamespace如果为false,则可以使空的命名空间实现放在一行, 如果想要值为false时生效,必须使AfterNamespace为 true
  SplitEmptyNamespace: false
# 二元运算符的格式控制
# None 在二元操作符之后换行
# NonAssignment 在二元操作符之前换行,赋值运算符''=''除外
# All 在所有的二元操作符之前换行
BreakBeforeBinaryOperators: NonAssignment
# 控制括号换行风格
# Attach 始终将括号依附在上下文当中
# Linux 类似Attach,但是在function,namespace,class定义的括号前换行
# Mozilla 类似Attach,但是在enum,function,record的括号前换行
# Stroustrup 类似Attach,但是在function,catch,else前换行
# Allman 总是在括号前换行
# GUN
BreakBeforeBraces: Attach
# 如果为true,则在三元算符之前换行
BreakBeforeTernaryOperators: true
# 控制构造初始化函数样式
# BeforeColon 在冒号之前逗号之后换行
# BeforeComma 在冒号和逗号之前换行,并对其逗号和冒号
# AfterColon 在冒号和逗号之前换行
BreakConstructorInitializers: AfterColon
# 控制多继承样式
# BeforeColon 在冒号之前逗号之后换行
# BeforeComma 在冒号和逗号之前换行,并对其逗号和冒号
# AfterColon 在冒号和逗号之前换行
BreakInheritanceList: AfterColon
# 是否允许在字符串常量中换行
BreakStringLiterals: false
# CompactNamespaces
# 如果为true,则连续的名称空间声明将在同一行上。 如果为false,则在新的一行上声明每个名称空间。
CompactNamespaces: true
# 当true,如果构造函数初始化不适合一行显示,则每个初始化器独占一行
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 决定JavaScript 的import/export声明是否需要换行
JavaScriptWrapImports: true
# 缩进
# 设置制表符(\t)的列数
TabWidth: 4
# Never)从不使用制表符
# ForIndentation) ,只在缩进时,使用制表符
# ForContinuationAndIndentation 仅使用制表符用于连续行和缩进。
# Always) ,每当我们需要填充至少从一个制表位到下一个制表位的空白时,请使用制表符
UseTab: Never
# 访问修饰符的缩进
AccessModifierOffset: 0
# 用于设定构造函数和多继承的缩进长度
ConstructorInitializerIndentWidth: 2
# 连续行的缩进长度
ContinuationIndentWidth: 4
# IndentCaseLabels
# 如果值为false,则使用与switch语句相同的缩进,case的语句缩进总是比case本身高一级;
IndentCaseLabels: true
# 控制预处理指令缩进样式
# None 不做任何缩进
# AfterHash 在hash(#if,#ifdef,#ifndef,#elif,#else,#endif)后缩进
IndentPPDirectives: AfterHash
# 缩进的列数
IndentWidth: 4
# 如果为true,函数的定义或声明在返回值类型之后换行,则缩进
IndentWrappedFunctionNames: true
# namespaces的缩进
# None 不缩进
# Inner 只在嵌套的namespaces中缩进
# All 所有的namespaces都缩进
NamespaceIndentation: All
# 控制ObjC的代码块(Block)实现的缩进
ObjCBlockIndentWidth: 4
# ObjC里,在@property后加空格
ObjCSpaceAfterProperty: false
# 代码最大列数,值为0意味着不限制;
ColumnLimit: 0
# 不同的枚举值,可以决定短方法的不同样式
# None 永不将函数合并为一行
# InlineOnly 只合并定义在class中的短方法
# Empty 只合并空函数
# Inline 只合并定义在class中的短方法,和空方法
# All 合并所有适合一行展示的函数
AllowShortFunctionsOnASingleLine: All
# Cpp03 使用C ++ 03兼容语法。
# Cpp11) 使用它 C++11, C++14 , C++1z的特性(例如A<A<int>>来兼容 A<A<int> >)
# Auto 基于输入自动检测。
Standard: Cpp11
# linux内核样式类似的样式
# BasedOnStyle: LLVM
# IndentWidth: 8
# UseTab: Always
# BreakBeforeBraces: Linux
# AllowShortIfStatementsOnASingleLine: false
# IndentCaseLabels: false
# 默认Visual Studio格式样式的类似样式
# UseTab: Never
# IndentWidth: 4
#BreakBeforeBraces: Allman我不喜欢,我喜欢attach
# BreakBeforeBraces: Allman
# AllowShortIfStatementsOnASingleLine: false
# IndentCaseLabels: false
# ColumnLimit: 0