一哥攘、生成配置(LLVM風(fēng)格):
# 假定你的vscode clang-format插件中配置的配置文件名為.clang-format
cd <your project root>
clang-format --style=LLVM -dump-config > .clang-format
二虱颗、修改配置(以下為當(dāng)前這邊使用的配置罗丰,大家可以基于此模板修改)
強(qiáng)烈大家根據(jù)官網(wǎng)options解釋進(jìn)行配置椎眯,CLangFormatStyleOptions:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
---
Language: Cpp
# 基于的編碼規(guī)范, 可選:
# - LLVM: https://llvm.org/docs/CodingStandards.html
# - Google: https://google.github.io/styleguide/cppguide.html
# - Chromium: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/styleguide/styleguide.md
# - Mozilla: https://firefox-source-docs.mozilla.org/code-quality/coding-style/index.html
# - WebKit: https://www.webkit.org/coding/coding-style.html
# - Microsoft: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# - GNU: https://www.gnu.org/prep/standards/standards.html
# - InheritParentConfig: 繼承父目錄的編碼規(guī)范, 如果有的話, 不是一個真正的編碼規(guī)范
# - None: 不使用, 即自動配置, 也就是本文件中的自定義內(nèi)容
# BasedOnStyle: LLVM
#訪問聲明符縮進(jìn)
AccessModifierOffset: -4
# 開括號后的對齊(包括小括號/大括號/尖括號), 建議使用Align
# - Align: 對于開括號, 即在換行情況下, 換行的參數(shù)跟開括號對齊, 建議使用
# - DontAlign: 不對于開括號, 即換行時使用配置的空格數(shù)
# - AlwaysBreak: 永遠(yuǎn)換行, 即第一個參數(shù)都不允許粘連括號, 會強(qiáng)制換行, 換行后使用配置空格數(shù)對齊
# - BlockIndent: 同AlwaysBreak, 多了一個操作: 如果參數(shù)不固定在同一行, 閉括號將在下一行
AlignAfterOpenBracket: Align
# - 結(jié)構(gòu)休數(shù)組統(tǒng)一初始化對齊, 建議不配置, 沒過多必要, 詳見clang-format doc
# - None: 不做處理, 即保留開發(fā)者的代碼
# - Left: 左對齊
# - Right: 右對齊
AlignArrayOfStructures: None
# 連續(xù)賦值語句的對齊挠将,即多個賦值語句連續(xù)出現(xiàn)時的對齊策略配置, 包含多個子配置項
AlignConsecutiveAssignments:
# 是否啟用, 建議不啟用
Enabled: false
# 是否跨過空行, 即多個對齊語句中間有空行時, 是否跨過, 如果要開啟連續(xù)賦值語句的配置, 建議為false
AcrossEmptyLines: false
# 同AcrossComments: 即是否跨過注釋, 建議false
AcrossComments: false
# 是否跨過復(fù)合語句(包括空行及注釋), 建議False
AlignCompound: false
# 是否(右)對齊賦值操作的操作符, 建議true
PadOperators: true
# 同AlignConsecutiveAssignments, 表示連續(xù)位定義語句出現(xiàn)時, 是否需要對齊:符號, 位變量定義用得少, 可以不開啟
AlignConsecutiveBitFields:
# 是否啟用, 建議不啟用
Enabled: false
# 同AlignConsecutiveAssignments
AcrossEmptyLines: false
# 同AlignConsecutiveAssignments
AcrossComments: false
# 只在AlignConsecutiveAssignments配置中有效, 自動生成的clang-format有此項, 忽略
AlignCompound: false
# 只在AlignConsecutiveAssignments配置中有效, 自動生成的clang-format有此項, 忽略
PadOperators: false
# 是否對齊連續(xù)聲明, 同AlignConsecutiveDeclarations
AlignConsecutiveDeclarations:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
PadOperators: false
AlignConsecutiveMacros:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
# 只在AlignConsecutiveAssignments配置中有效, 自動生成的clang-format有此項, 忽略
AlignCompound: false
# 只在AlignConsecutiveAssignments配置中有效, 自動生成的clang-format有此項, 忽略
PadOperators: false
# 續(xù)行符(\\)對齊:
# - DontAlign: 不做操作
# - Left: 盡可能向左對齊, 即最長一行代碼為準(zhǔn)
# - Right: 跟開發(fā)都寫的最遠(yuǎn)的\\對齊(即不會自動縮減你的空格), 建議使用這個
AlignEscapedNewlines: Right
# 在二元/一元表達(dá)式中的操作數(shù)對齊, 可選值:
# - DontAlign: 不做對齊, 在操作數(shù)換行后, 將使用ContinuationIndentWidth來對齊
# - Align: 即換行時, 操作數(shù)(or 操作符加操作數(shù))跟上一行的第一個操作數(shù)左對齊, 具體操作符要不要換行, 由BreakBeforeBinaryOperators配置決定
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
# 允許短的函數(shù)放在同一行, 可選值: None, InlineOnly(定義在類中), Empty(空函數(shù)), Inline(定義在類中,空函數(shù)), All
AllowShortFunctionsOnASingleLine: All
# 允許lambda在一行中, 同上, 建議All
AllowShortLambdasOnASingleLine: All
# 是否將簡單的if(else/else if)語句中的body跟if(else/else if)放置于同一行编整,可選值
# - Never: 永遠(yuǎn)不, 建議值
# - WithoutElse: 沒有else/else if時, 允許
# - OnlyFirstIf: 只有第一個if允許
# - AllIfAndElse: 所有的if/else都允許
AllowShortIfStatementsOnASingleLine: Never
# 是否允許loop語句體跟loop語句共行, true/false, 建議false
AllowShortLoopsOnASingleLine: false
# Deprecated, 廢棄定義, 設(shè)置為None即可
AlwaysBreakAfterDefinitionReturnType: None
# Return類型后是否換行, 詭異的定義, 請設(shè)置為None即可
AlwaysBreakAfterReturnType: None
# 多常量字符串定義是, 是否在第一個字符串常量前換行, true/false, 建議false
AlwaysBreakBeforeMultilineStrings: false
# 模板聲明換行風(fēng)格, 可選值:
# - No: 永遠(yuǎn)不對開發(fā)者的風(fēng)格作處理
# - MultiLine: 建議值, 即僅在開發(fā)者寫的模板聲明(包括函數(shù))跨越多行時, 進(jìn)行換行, 否則維持原樣
# - Yes: 不管如何都進(jìn)行分行, 不建議
AlwaysBreakTemplateDeclarations: MultiLine
# 屬性宏列表, 自定義, 用于語言擴(kuò)展或靜態(tài)分析注解, 可忽略
AttributeMacros:
- __capability
# 函數(shù)調(diào)用時的參數(shù)(Arguments)是否放置于一行, false不放置, true強(qiáng)制一個調(diào)用參數(shù)一行, 建議false
BinPackArguments: false
# 函數(shù)定義參數(shù)(Parameters)是否放置于一行, 同BinPackArguments
BinPackParameters: false
# 大括號換行
BraceWrapping:
# 在case后的大括號是否換行
AfterCaseLabel: true
# class后
AfterClass: true
# 控制語句(if/for/while/switch/...)后是否換行
# - Never: 永遠(yuǎn)不, 即永遠(yuǎn)將語句體的大括號放置于控制語句同一行
# - MultiLine: 多行控制語句才進(jìn)行換行
# - Always: 永遠(yuǎn)換行, 建議
AfterControlStatement: Always
# 下面比較容易理解, 不再作無意義的解釋
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: false
BeforeElse: true
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
# 二元操作符前是否換行, 建議為None
BreakBeforeBinaryOperators: None
# 概念聲明前是否換行, 建議Always
BreakBeforeConceptDeclarations: Always
# 大括號換行風(fēng)格,Custom即可, 具體值可參考上方文檔
BreakBeforeBraces: Custom
# 繼承列表括號前換行, false即可
BreakBeforeInheritanceComma: false
# 是否將整個繼承列表換行
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
# 是否在構(gòu)造函數(shù)初始化列表的,前換行
BreakConstructorInitializersBeforeComma: false
# 繼承列表換行風(fēng)格, 使用BeforeComma適合
BreakConstructorInitializers: BeforeComma
# Java注解相關(guān), 跳過
BreakAfterJavaFieldAnnotations: false
# 字面字符串是否換行, true
BreakStringLiterals: true
# 代碼列字符上限
ColumnLimit: 120
# pragma注釋
CommentPragmas: '^ IWYU pragma:'
# 注釋關(guān)鍵字對齊(const/volatile), 建議Leave
# - Leave: - 不改變開發(fā)者定義
# - Left: 位于類型前
# - Right: 位于類型后
# - Custom: 自定義
QualifierAlignment: Leave
# 未在文檔中找到
CompactNamespaces: false
# 構(gòu)造函數(shù)初始化列表縮進(jìn), 建議0
ConstructorInitializerIndentWidth: 0
# 函數(shù)調(diào)用續(xù)行對齊, 建議4
ContinuationIndentWidth: 4
# C++11的統(tǒng)一初始化列表大括號風(fēng)格, 建議true
Cpp11BracedListStyle: true
# 提取行結(jié)束符并標(biāo)準(zhǔn)化, 建議false, 不要進(jìn)行分析及自動運(yùn)用, 而是強(qiáng)制使用UseCRLF設(shè)定來做
DeriveLineEnding: true
# 是否開啟文件分析, 根據(jù)文件中的*/&使用情況更新clang-format設(shè)定, 在無法決定時, 使用PointerAlignment代替, 不建議開啟
DerivePointerAlignment: false
DisableFormat: false
# 訪問限定后是否添加空行, 建議Never
EmptyLineAfterAccessModifier: Never
# 訪問限定前是否要求空行, 建議LogicalBlock
EmptyLineBeforeAccessModifier: LogicalBlock
# 實驗性的自動檢測同行并進(jìn)行操作舔稀, 建議false
ExperimentalAutoDetectBinPacking: false
# 是否打包構(gòu)造函數(shù)初始化列表, 建議Never, 可選:
# - Never: 永遠(yuǎn)不做操作, 即一個參數(shù)一行
# - BinPack: 兩個參數(shù)一行
# - CurrentLine: 所有參數(shù)放置于一行, 如果放不下, 就一個參數(shù)一行
# - NextLine: 同CurrentLine有點(diǎn)像, 唯一不同就是如果放不行, 將剩余參數(shù)放置于下一行(即不自動一參一行)
PackConstructorInitializers: Never
BasedOnStyle: ''
# 廢棄配置
ConstructorInitializerAllOnOneLineOrOnePerLine: false
# 廢棄配置
AllowAllConstructorInitializersOnNextLine: true
# 是否強(qiáng)制在namespace結(jié)尾增加 // namespace xxx, 建議為true
FixNamespaceComments: true
# 大于多少行namespace內(nèi)的代碼行時才在namespace結(jié)尾添加 // namespace xxx, 建議0,即無論如何都添加
ShortNamespaceLines: 0
# Macro宏
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
#If宏
IfMacros:
- KJ_IF_MAYBE
# include代碼塊操作, 前提是SortIncludes開啟:
# - Preserve: 只對每個代碼塊排序
# - Merge: 對所有代碼塊合并, 并在合并后排序
# - Regroup: 對所有include塊進(jìn)行分析, 并重新分塊, 不建議!
IncludeBlocks: Preserve
# Include Sort選項, 可選:
# - Never: 永遠(yuǎn)不, 建議
# - CaseSensitive: 大小寫敏感排序
# - CaseInsensitive: 大小寫不敏感排序
SortIncludes: Never
# Include種類, 默認(rèn)即可
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
# 縮進(jìn)訪問控制
IndentAccessModifiers: false
# 縮進(jìn)case語句, 建議false
IndentCaseLabels: false
# 縮進(jìn)case body, 建議true
IndentCaseBlocks: true
# 縮進(jìn)goto標(biāo)簽
IndentGotoLabels: true
# 預(yù)處理指示(PPD-PreProcessor Directive)縮進(jìn), 建議None
# - None: 不縮進(jìn)
# - AfterHash: #不縮進(jìn), #后面的指示縮進(jìn)
# - BeforeHash: #跟前縮進(jìn)
IndentPPDirectives: None
# extern "C"縮進(jìn), 建議AfterExternBlock
IndentExternBlock: AfterExternBlock
# 模板require是否縮進(jìn)
IndentRequiresClause: true
# 縮進(jìn)寬度
IndentWidth: 4
# 函數(shù)名換行時, 是否縮進(jìn)(即返回值跟名字不同行時), 建議false
IndentWrappedFunctionNames: false
# 是否在代碼塊中(if/else/for/do/while)強(qiáng)制插入大括號, 建議false
InsertBraces: false
# 是否強(qiáng)制插入拖尾的',', 建議為None
InsertTrailingCommas: None
# Java相關(guān), 跳過
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
# 是否block開始前有一個empty line, 詭異, 直接false
KeepEmptyLinesAtTheStartOfBlocks: false
# 未找到定義
LambdaBodyIndentation: Signature
# 宏開始的正則, 不使用
MacroBlockBegin: ''
# 宏結(jié)束的正則, 不使用
MacroBlockEnd: ''
# 空行保持, 建議為1
MaxEmptyLinesToKeep: 1
# Namespace內(nèi)的對齊, 直接使用None即可, 即所有namespace內(nèi)(包括內(nèi)嵌的)都不indent
NamespaceIndentation: None
# Obj-C語言設(shè)置, 跳過
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
# 罰分設(shè)定(根據(jù)你的"違規(guī)"值選擇罰分少的)
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0
# 指針對齊, 建議Right
PointerAlignment: Right
# 引用對齊, 可選:
# - Pointer: 使用'PointerAlignment'配置, 建議使用
# - Left: Left
# - Right: Right
ReferenceAlignment: Pointer
# 預(yù)處理對齊寬度
PPIndentWidth: -1
# 是否允許clang-format嘗試重新粘合注釋(true/false), 不建議使用
ReflowComments: false
# 是否移除多余的{}, 不建議
RemoveBracesLLVM: false
# 模板中的require語句位置, 建議OwnLine
RequiresClausePosition: OwnLine
# 分隔不同定義塊, 建議Always, 可選:
# - Leave - 不處理, 建議, 即由業(yè)務(wù)決定, 也可以使用Always
# - Always - 永遠(yuǎn)進(jìn)行分隔
# - Never: 永遠(yuǎn) 不進(jìn)行, 不建議
SeparateDefinitionBlocks: Leave
# Java項, 跳過
SortJavaStaticImport: Before
# 排序using語句(true/false), 不建議開啟
SortUsingDeclarations: false
# C風(fēng)格cast的類型括號后面是否增加space(true/false), 比較詭異, 建議false
SpaceAfterCStyleCast: false
# 邏輯非操作(!)后面是否加space(true/false), 比較詭異, 建議false
SpaceAfterLogicalNot: false
# template關(guān)鍵字后面是否加space(true/false), 建議true, 即template <xxx>, 而不是template<xxx>
SpaceAfterTemplateKeyword: true
# 賦值語句操作符前是否添加space(true/false), 建議true
SpaceBeforeAssignmentOperators: true
# case語句:前是否增加space(true/false), 建議false
SpaceBeforeCaseColon: false
# c++11的統(tǒng)一初始化列表的大括號中是否添加space(true/false), 建議false
SpaceBeforeCpp11BracedList: false
# 構(gòu)造函數(shù)初始化列表:前是否加space(true/false), 建議false
SpaceBeforeCtorInitializerColon: false
# 繼承列表的:前是否加space(true/false), 建議true
SpaceBeforeInheritanceColon: true
# 圓括號前是否增加空格: 建議只在控制語句的賀括號前增加, 即配置為ControlStatements即可
SpaceBeforeParens: ControlStatements
# SpaceBeforeParens為Custom時使用
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
AfterRequiresInClause: false
AfterRequiresInExpression: false
BeforeNonEmptyParentheses: false
# 指針修飾的space添加, 建議Default, 即使用PointerAlignment代替
SpaceAroundPointerQualifiers: Default
# Loop關(guān)鍵字前前是否增加space, 建議true
SpaceBeforeRangeBasedForLoopColon: true
# 空body是否添加space, 建議true
SpaceInEmptyBlock: true
# 圓括號前是否增加space, 建議false, true太多影響代碼緊湊
SpaceInEmptyParentheses: false
# Trailing注釋前的空格數(shù), 建議1
SpacesBeforeTrailingComments: 1
# <>里面是否增加space, 不建議, 配置成Never即可
SpacesInAngles: Never
# 條件語句()里面是否增加space, 不建議, 配置成Never即可
SpacesInConditionalStatement: false
# 容器初始化列表[]/{}里面是否增加space, 不建議(跟C++11風(fēng)格保持一致)
SpacesInContainerLiterals: false
# C風(fēng)格的轉(zhuǎn)換()里面是否增加space, 不建議
SpacesInCStyleCastParentheses: false
# 行注釋前的空格范圍數(shù)量, 建議Maximum關(guān)閉, 設(shè)置成-1, 即//到你的注釋內(nèi)容前的空格數(shù)量至少是1, 至多是無窮
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
# 賀括號內(nèi)是否加space, false
SpacesInParentheses: false
# 中括號內(nèi)是否加space, false
SpacesInSquareBrackets: false
# 大括號內(nèi)是否加space, false
SpaceBeforeSquareBrackets: false
# 位定義:前后是否增加空格, 可選:
# - Both: 前后都添加
# - Before: 只在前增加
# - After: 只在后增加
# - None: 不增加, 建議, 沒有必要因為過多的space(s)影響代碼緊湊
BitFieldColonSpacing: None
# C++標(biāo)準(zhǔn), Latest即可
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
# Tab寬度, 建議4
TabWidth: 4
# 不使用CRLF, 強(qiáng)制關(guān)閉, 如果DeriveLineEnding為true卻未自動決策出來, 此項用于fallback策略
UseCRLF: false
# Tab使用, 沒有必要使用, 直接Never
UseTab: Never
# 空格敏感宏列表
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...