格式化代码C++
该文记录 Visual Studio Code
、 Visual Studio 2022
、 Qt Creator 4.11
使用 clang-format
进行格式化代码。
格式化代码C++
1. 介绍
1.1. 概述
- 官方参考:https://clang.llvm.org/docs/ClangFormat.html
ClangFormat
是 LLVM
开发的用于格式化 C/C++/Java/JavaScript/JSON/Objective-C/Protobuf/C#
等多种语言代码的工具,借助 ClangFormat
可以实现代码仓库的风格统一,提升开发效率。
1.2. 格式文件
创建格式文件的一种简单方法是:.clang-format
。到 clang-format
目录运行即可得到。
1
2
# 常见格式 LLVM, GNU, Google, Chromium, Microsoft, Mozilla, WebKit.
clang-format -style=llvm -dump-config > .clang-format
生成文件如下(2022-12-01):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
---
# 语言 : None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp
# BasedOnStyle: LLVM
# 访问权限说明符的偏移(public/private等)
AccessModifierOffset: -4
# 开括号后的对齐(开圆括号、尖括号、方括号),
# 对齐方式有:Align, DontAlign, AlwaysBreak(总是在开括号后换行)
AlignAfterOpenBracket: Align
##################################################
# 对齐方式之 AlignConsecutiveStyle
# 连续相同操作时的对齐方式
# -- None - 不对齐
# -- Consecutive - 对齐所有连续操作(遇到空行或注释则不再对齐)
# -- AcrossEmptyLines - 在 Consecutive 的基础上,遇到空行时继续对齐,遇到注释时不再对齐
# -- AcrossComments - 在 Consecutive 的基础上,遇到注释时继续对齐,遇到空行时不再对齐
# -- AcrossEmptyLinesAndComments - 在 Consecutive 的基础上,遇到空行或注释时,继续对齐
##################################################
# 连续宏定义时的对齐方式 (@ref AlignConsecutiveStyle)
AlignConsecutiveMacros: Consecutive
# 连续赋值时的对齐方式(@ref AlignConsecutiveStyle)
AlignConsecutiveAssignments: Consecutive
# 连续位域的对齐方式(@ref AlignConsecutiveStyle)
AlignConsecutiveBitFields: Consecutive
# 连续声明时,变量名的对齐方式(@ref AlignConsecutiveStyle)
AlignConsecutiveDeclarations: Consecutive
# 反斜杆换行的对齐方式
# -- DontAlign - 不进行对齐
# -- Left - 反斜杠靠左对齐
# -- Right - 反斜杠靠右对齐
AlignEscapedNewlines: Right
# 二元、三元表达式的对齐方式(当表达式需要占用多行时)
# -- DontAlign - 不进行对齐
# -- Align - 从操作符开始对齐
# -- AlignAfterOperator - 从操作数开始对齐
AlignOperands: Align
# 是否对齐行尾注释?
# -- true - 启用对齐
# -- false - 无需对齐
AlignTrailingComments: true
# 当函数调用和参数无法放在同一行时,是否将参数全部放在下一行
# -- true - 全部放在下一行
# -- false - 不全部放在下一行
AllowAllArgumentsOnNextLine: true
# 当构造函数的成员变量初始化无法放在同一行时,是否将成员变量的初始化放在下一行?
# -- true - 全部放在下一行
# -- false - 不全部放在下一行
# NOTE : 本配置仅在 ConstructorInitializerAllOnOneLineOrOnePerLine 为 true 时有效
AllowAllConstructorInitializersOnNextLine: true
# 当函数声明和参数无法放在同一行时,是否将所有参数放在下一行?
# -- true - 所有参数放在下一行
# -- false - 不全部放在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# 是否允许短的枚举放在同一行?
# -- true - 允许放在同一行
# -- false - 不允许放在同一行
AllowShortEnumsOnASingleLine: false
# 是否允许短的代码块放在同一行?
# -- Never - 不允许放在同一行
# -- Empty - 只有空的代码块允许放在同一行
# -- Always - 允许短的代码块放在同一行
AllowShortBlocksOnASingleLine: Always
# 允许短的 case 标签和语句放在同一行?
# -- true - 允许放在同一行
# -- false - 不允许放在同一行
AllowShortCaseLabelsOnASingleLine: true
# 是否允许短的函数放在同一行?
# -- None - 不把短的函数放在同一行
# -- InlineOnly - 只把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- Empty - 只把空的函数放在同一行
# -- Inline - 把类内的内联函数放在同一行,全局的空函数不放在同一行
# -- All - 都允许放在同一行
AllowShortFunctionsOnASingleLine: All
# 允许短的 lambda 语句放在同一行?
# -- None - 不把短的 lambda 语句放在同一行
# -- Empty - 只把空的lambda 语句放在同一行
# -- Inline - 当短的 lambda 语句作为函数参数时,放在同一行
# -- All - 将短的 lambda 语句放在同一行
AllowShortLambdasOnASingleLine: All
# 是否允许短的 if 语句放在同一行?
# -- Never - 不把短的if语句放在同一行
# -- WithoutElse - 当没有 else 时,把短的 if 语句放在同一行
# -- OnlyFirstIf - 把短的 if 语句放在同一行,短的 else if 和 else 不放在同一行
# -- AllIfsAndElse - 把短的 if、else if、else 语句放在同一行
AllowShortIfStatementsOnASingleLine: Never
# 是否允许短的循环放在同一行?
# -- true - 允许放在同一行
# -- false - 不允许放在同一行
AllowShortLoopsOnASingleLine: false
# 总是在定义函数的返回类型后换行?
# -- None - 由 @ref PenaltyReturnTypeOnItsOwnLine 决定
# -- All - 总是换行
# -- TopLevel - 在顶层函数(类外函数)中总是换行
# Note : 该配置已不推荐使用
AlwaysBreakAfterDefinitionReturnType: None
# 函数声明、定义时,返回值类型的换行方式
# -- None - 由 @ref PenaltyReturnTypeOnItsOwnLine 决定
# -- All - 总是在返回值类型后换行
# -- TopLevel - 仅在顶层函数(类外函数)的声明、定义中换行
# -- AllDefinitions - 在所有函数的定义中换行
# -- TopLevelDefinitions - 仅在顶层函数(类外函数)的定义中换行
AlwaysBreakAfterReturnType: None
# 是否总是在多行string前换行?
# -- true - 换行
# -- false - 不换号
AlwaysBreakBeforeMultilineStrings: false
# 模板声明的换行方式
# -- None - 由 @ref PenaltyBreakTemplateDeclaration 控制
# -- MultiLine - 仅在模板声明需要占用多行时换行
# -- Yes - 总是换行
AlwaysBreakTemplateDeclarations: Yes
# 定义语言或编译器的扩展属性字符串,以免 clang 无法识别
AttributeMacros:
- __capability
# 函数调用时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
BinPackArguments: false
# 函数声明、定义时,参数的放置规则
# -- false - 参数要么放在同一行,要么每个参数占用一行
# -- true - 不做强制要求
BinPackParameters: false
# 大括号换行规则,只有当 @ref BreakBeforeBraces 设置为 Custom 时才有效
BraceWrapping:
# 是否在 case 后面换行? (true\false)
AfterCaseLabel: true
# 是否在 class 后换行?(true\false)
AfterClass: true
# 控制语句后的换行规则
# -- Never - 控制语句后不换行
# -- MultiLine - 当控制语句由多行组成时,继续换行
# -- Always - 总是换行
AfterControlStatement: Always
# 是否在枚举定义后换行?(true\false)
AfterEnum: true
# 是否在函数后换行?(true\false)
AfterFunction: true
# 是否在命名空间后换行?(true\false)
AfterNamespace: true
# 是否在 struct 定义时换行?(true\false)
AfterStruct: true
# 是否在 union 定义后换行?(true\false)
AfterUnion: true
# 是否在 extern 后换行?(true\false)
AfterExternBlock: true
# 是否在 catch 前换行?(true\false)
BeforeCatch: true
# 是否在 else 前换行?(true\false)
BeforeElse: true
# 是否在 lambda 前换行?(true\false)
BeforeLambdaBody: false
# 是否在 do-while 的 while 前换行?(true\false)
BeforeWhile: true
# 大括号是否参与缩进?
IndentBraces: false
# 当空白函数的 {} 和函数名称不需要放在同一行时,是否拆分函数体?
# -- false - {} 可以放在同一行
# -- true - {} 分别放在两行
SplitEmptyFunction: true
# 当空白结构(class\struct\union)的 {} 需要放在单独的行时,是否拆分 {} ?
# -- false - {} 可以放在同一行
# -- true - {} 分别放在两行
SplitEmptyRecord: true
# 当空白的命名空间的 {} 需要放在单独的行时,是否拆分 {} ?
# -- false - {} 可以放在同一行
# -- true - {} 分别放在两行
SplitEmptyNamespace: true
# 二元表达式的换行风格
# -- None - 在操作符后之后换行,操作符位于上一行尾部
# -- NonAssignment - 除赋值操作符外,其它操作符位于换行后的头部
# -- All - 所有操作符放在换行后的头部
BreakBeforeBinaryOperators: None
# 是否在 concept 声明前换行?(true\false)
BreakBeforeConceptDeclarations: true
# 大括号放置风格
# -- Attach - 大括号紧随前方内容,放在同一行
# -- Linux - 与 Attach 类似,除了 函数、命名空间、类定义 的大括号放在下一行
# -- Mozilla - 与 Attach 类似,除了枚举、函数、结构(class\struct\union)的大括号放在下一行
# -- Stroustrup - 与 Attach 类似,但函数定义前、catch前方、else前方的 {} 放在单独一行
# -- Allman - 总是换行
# -- Whitesmiths - 类似 Allman,但 {} 和内部的语句对齐到同样位置
# -- GNU - 总是换行,但在控制语句后的{} 总是对齐到下一个位置
# -- WebKit - 与 Attach 类似,但在函数定义前换行
# -- Custom - 依赖 @ref BraceWrapping
BreakBeforeBraces: Custom
# 类的继承列表的分割方式
# -- BeforeColon - 在冒号 ':' 前方分割,冒号位于行首,逗号','位于行尾
# -- BeforeComma - 在冒号和逗号前方分割,冒号和逗号都位于行首,并且对齐
# -- AfterColon - 在冒号和逗号后方分割,冒号和逗号位于行尾
# -- AfterComma - 仅在逗号后方分割,冒号和首个基类位于同一行
BreakInheritanceList: BeforeComma
# 当三元表达式不能放在同一行时,是否在三元操作符前方换行
# -- true - 操作符位于新行的首部
# -- false - 操作符位于上一行的尾部
BreakBeforeTernaryOperators: true
# 构造函数初始化列表分割方式
# -- BeforeColon - 在冒号 ':' 前方分割,冒号位于行首,逗号','位于行尾
# -- BeforeComma - 在冒号和逗号前方分割,冒号和逗号都位于行首,并且对齐
# -- AfterColon - 在冒号和逗号后方分割,冒号和逗号位于行尾
BreakConstructorInitializers: BeforeComma
# 是否分割过长的字符串?(true\false)
BreakStringLiterals: true
# 列宽长度限制
# -- 0 - 0代表没有限制
ColumnLimit: 0
# 用于匹配注释信息的正则表达式,被匹配的行不会做任何修改
CommentPragmas: "^ IWYU pragma:"
QualifierAlignment: Leave
# 是否压缩紧接的命名空间?
# -- true - 将紧跟的命名空间放在同一行
# -- false - 每个命名空间位于新的一行
CompactNamespaces: false
# 是否将构造函数的初始化列表放在同一行或各放一行?
# -- true - 如果可能,初始化列表放在同一行;如果不满足长度选择,则每个单独放一行
# -- false - 初始化列表可以随意放置
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# 构造函数的初始化列表和基类集成列表的对齐宽度
ConstructorInitializerIndentWidth: 4
# 延续语句的对齐宽度
ContinuationIndentWidth: 4
# C++ 11 初始化列表风格
# -- true -
# -- false -
Cpp11BracedListStyle: true
# 是否自动分析行结尾方式?
# -- true - 自动分析文件的行结尾方式,若无法分析,则使用 @ref UseCRLF
# -- false - 不自动分析
DeriveLineEnding: true
# 是否自动分析指针的对齐方式?
# -- true - 自动分析并使用指针的对齐方式,若无法分析,则使用 @ref PointerAlignment
# -- false - 不自动分析
DerivePointerAlignment: false
# 是否禁用格式化?(true\false)
DisableFormat: false
# 访问权限控制符(public\protected\private等)后方的空行规则
# -- Never - 移除所有空行
# -- Leave - 保留所有空行,受 @ref MaxEmptyLinesToKeep 限制
# -- Always - 若没有空行,则添加一个空行;若已有空行,则保留,并受 @ref MaxEmptyLinesToKeep 限制
EmptyLineAfterAccessModifier: Never
# 访问权限控制符(public\protected\private等)前方的空行规则
# -- Never - 移除所有空行
# -- Leave - 保留所有空行
# -- LogicalBlock - 仅在新的逻辑块前方加空行
# -- Always - 除第一个外,都在前方加空行
EmptyLineBeforeAccessModifier: LogicalBlock
# 实验性功能:是否自动分析 bin pack 类型?
# NOTE : 不建议启用
ExperimentalAutoDetectBinPacking: false
# 是否自动修正命名空间的结束注释?
# -- true - 在短的命名空间尾部,自动添加或修改错误的命名空间结束注释
# -- false - 不自动修正
FixNamespaceComments: true
# 应该被解释为 foreach 循环,而不是函数调用的宏定义
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
# 需要被忽略的宏定义,这些宏定义类似属性标签
StatementAttributeLikeMacros:
- Q_EMIT
# 多个 include 块(有空行分隔的include)排序时的分组规则
# -- Preserve - 保留原有的块分隔,各自排序
# -- Merge - 将所有的块视为同一个,然后进行排序
# -- Regroup - 将所有的块视为同一个进行排序,然后按照 @ref IncludeCategories 的规则进行分组
IncludeBlocks: Preserve
# 用于 include 排序的规则
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: ""
IndentAccessModifiers: false
# 是否缩进 case 标签?
# -- true - case 不与 switch 对齐
# -- false - case 和 switch 对齐
IndentCaseLabels: false
# 是否缩进 case 对应的大括号 "{}" ?
# - false - 块语句和case 标签对齐
# - true - 块语句在 case 标签后缩进
IndentCaseBlocks: false
# 是否缩进 goto 标签?
# -- false - goto 位于最左侧,不参与缩进
# -- true - goto 参与缩进
IndentGotoLabels: false
# 预处理命令(#if\#ifdef\#endif等)的缩进规则
# -- None - 不进行缩进
# -- AfterHash - 在前导'#'后缩进,'#'放在最左侧,之后的语句参与缩进
# -- BeforeHash - 在前导'#'前进行缩进
IndentPPDirectives: BeforeHash
# extern 内容的缩进规则
# -- AfterExternBlock - 依赖 @ref AfterExternBlock 的配置
# -- NoIndent - 不进行缩进
# -- Indent - 进行缩进
IndentExternBlock: NoIndent
# 是否缩进模板中的 requires?(true\false)
IndentRequires: false
# 缩进宽度
IndentWidth: 4
# 当函数过长导致换行时,是否进行缩进?(true\false)
IndentWrappedFunctionNames: false
# 是否在块的起始位置保留空行?(true\false)
# -- true - 保留块起始的空行
# -- false - 删除块起始的空行
KeepEmptyLinesAtTheStartOfBlocks: false
# Lambda 正文缩进
# -- Signature 将 lambda 主体与 lambda 函数对齐(默认)
# -- OuterScope 将 lambda 主体相对于 lambda 函数所在外部作用域的缩进级别对齐
LambdaBodyIndentation: Signature
# 用于识别宏定义型块起始的正则表达式
MacroBlockBegin: ""
# 用于识别宏定义型块结束的正则表达式
MacroBlockEnd: ""
# 允许保留的空行行数
MaxEmptyLinesToKeep: 1
# 命名空间内部的缩进规则
# -- None - 都不缩进
# -- Inner - 只缩进嵌套的命名空间内容
# -- All - 缩进所有命名空间内容
NamespaceIndentation: All
# 指针(*和&)的对齐规则
# -- Left - * 靠近左侧
# -- Right - * 靠近右侧
# -- Middle - * 放在中间
# NOTE : 在 @ref SpaceAroundPointerQualifiers 为 Default,
# 且 @ref DerivePointerAlignment 失效后启用
PointerAlignment: Left
# 是否重排注释?(true\false)
ReflowComments: true
# include 排序规则
# -- Never - 不进行排序
# -- CaseSensitive - 排序时大小写敏感
# -- CaseInsensitive - 排序时大小写不敏感
SortIncludes: CaseSensitive
# 是否排序所有 using 声明?(true\false)
SortUsingDeclarations: true
# 是否在 C 类型的强制转换后加空格?(true\false)
SpaceAfterCStyleCast: false
# 是否在逻辑取反(!)后加空格?(true\false)
SpaceAfterLogicalNot: false
# 是否在 template 关键字后加空格?(true\false)
SpaceAfterTemplateKeyword: true
# 是否在赋值运算符前加空格?(true\false)
SpaceBeforeAssignmentOperators: true
# 是否在 case 的冒号前添加空格?(true\false)
SpaceBeforeCaseColon: false
# 是否在 C++11 的初始化列表前加空格?(true\false)
SpaceBeforeCpp11BracedList: false
# 是否在构造函数的初始化冒号 “:” 前加空格?(true\false)
SpaceBeforeCtorInitializerColon: true
# 是否在构造函数的继承冒号 “:” 前加空格?(true\false)
SpaceBeforeInheritanceColon: true
# 小括号“()” 前加空格的规则
# -- Never - 从不加空格
# -- ControlStatements - 只在控制语句(for/if/while...)时加空格
# -- ControlStatementsExceptForEachMacros - 类型 ControlStatements,只是不再 ForEach 后加空格
# -- Always - 总是添加空格
# -- NonEmptyParentheses - 类似 Always,只是不再空白括号前加空格
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
# 指针前后的空格规则
# -- Default - 使用 @ref PointerAlignment 控制空格
# -- Before - 确保指针前有空格
# -- After - 确保指针后有空格
# -- Both - 确保前后都有空格
SpaceAroundPointerQualifiers: Default
# 是否在 for 循环的冒号“:” 前加空格?(true\false)
SpaceBeforeRangeBasedForLoopColon: true
# 是否在空白的 {} 中添加空格?(true\false)
SpaceInEmptyBlock: false
# 是否在空白的小括号 () 中添加空格?(true\false)
SpaceInEmptyParentheses: false
# 注释内容与注释起始符"//" 之间的空格数量
SpacesBeforeTrailingComments: 1
# 中括号 “<>” 中的空格规格
# -- Never - 移除所有空格
# -- Always - 总是添加空格
# -- Leave - 至多保留1个空格
SpacesInAngles: Never
# 是否在条件语句(if/for/switch/while)中添加空格?
SpacesInConditionalStatement: false
# 是否在容器中添加空格?(true\false)
SpacesInContainerLiterals: true
# 是否在 C 类型的强制转换的小括号内加空格?(true\false)
SpacesInCStyleCastParentheses: false
# 单行注释空格占位
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
# 圆括号中空格占位
SpacesInParentheses: false
# 是否在中括号中加空格?(true\false)
# NOTE:当中括号内没有数据时,不受本规则影响(如空白的lambda 捕获表、不定长度的数组声明)
SpacesInSquareBrackets: false
# 是否在方括号前方加空格?(true\false)
# NOTE 1: lambda 捕获表不受影响
# NOTE 2: 连续的方括号,仅在第一个方括号前加空格
SpaceBeforeSquareBrackets: false
# 位域中冒号":" 的添加规则
# -- Both - 在前后都加空格
# -- None - 在前后都不加空格,除非受 @ref AlignConsecutiveBitFields 影响
# -- Before - 只在前方加空格
# -- After -- 只在后方加空格
BitFieldColonSpacing: Both
# 语言标准
Standard: Latest
# 应被视为表达式的宏定义列表
# NOTE : 主要用于宏扩展后自带分包的语句
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
# tab 宽度
TabWidth: 4
# 使用使用 "\r\n" 作为换行?(true\false)
UseCRLF: false
# 是否使用 tab
# -- Never - 从不使用
# -- ForIndentation - 仅用于缩进
# -- ForContinuationAndIndentation -
# -- AlignWithSpaces -
# -- Always -
UseTab: Never
# 对括号敏感的宏定义列表,不允许修改这些宏定义
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...
2. 常用软件
2.1. Visual Studio Code
2.1.1 安装
在 vscode
中安装扩展 C/C++
,扩展程序将自动安装 clang-format
。
2.1.2 使用
在项目根目录下创建 .vscode/settings.json
。一般项目会自动生成文件,只需要在文件中添加。
1
2
3
4
5
6
{
// Visual Studio LLVM Google Chromium Mozilla WebKit
// "C_Cpp.clang_format_style": "{BasedOnStyle: LLVM}"
"C_Cpp.clang_format_style": "file", // 使用自定义文件格式化
"editor.formatOnSave": false, // 是否自动保存格式化
}
格式化的快捷方式 Shift+Alt+F
,想要修改可以 Ctrl+K Ctrl+S
打开键盘快捷方式,输入格式化找到对应命令修改即可。
2.2. Visual Studio 2022
VS2022
下载好自带格式化设置,只需要将格式化文件拷贝到项目根目录,并修改 VS2022
工具 => 选项 => 文本编辑器 => C/C++
=> 代码样式 => 格式设置 => 使用自定义 clang-format.exe
,选择一个可用的 clang-format.exe
即可
格式化的快捷方式 Ctrl+K Ctrl+D
,修改在工具 => 选项 => 环境 => 键盘,修改 编辑.设置文档格式
格式,格式化的快捷方式修改为 Shift+Alt+F
。
2.3. Qt Creator 4.11
Qt Creator 4.11
安装好也是自带格式化设置,但是需要打开。在帮助 => 关于插件 => C++
=> Beautifier(expermental)
打开重启即可。
然后设置 => 工具 => 选项 => Beautifier
=> Clang Format
,然后设置格式化程序和格式化文件,Use customized style
点击 Edit
将格式化文件复制到里面即可(不支持中文,所以需要删除注释)。
添加格式化快捷键在工具 => 选项 => 环境 => 键盘,修改 FormatFile
格式,点击 Record
记录修改后的快捷键,格式化的快捷方式修改为 Shift+Alt+F
。
3. 参考
[1] https://clang.llvm.org/docs/ClangFormat.html
[2] https://clang.llvm.org/docs/ClangFormatStyleOptions.html