代码格式化工具:clang-format
代码格式化工具:clang-format
平时团队进行合作的时候需要注意代码的格式,虽然很难统一每个人的编码风格,但是通过工具能够很好的管理代码格式。clang-format,它是基于clang的一个命令行工具,能够自动化格式C/C++/Obj-C代码,支持多种代码风格:Google、Chromium、LLVM、Mozilla、WebKit,也支持自定义风格(通过编写.clang-format文件)很方便的统一代码格式。
1. 获取clang-format
官网:https://releases.llvm.org/download.html
如上图所示,LLVM有很多的版本,且其更新较快,我们可以选择其中的一个版本进行下载,点“page”进入下载界面,如下:
将该文件下载下来之后,直接双击安装即可,安装完毕会在安装目录看到如下:
对于使用vscode的开发者而言,不需要单独去下载此执行文件,因为在vscode中按照c/c++插件时,已经默认安装了clang-format可执行文件。
2. 在SourceInsight中添加clang-format
- 在工具栏的 Tools 找到 Custom Commands,进入如下界面中:
Step1:点
Add...
,新建一个命令,取名clang-format(名称可以随便取,只要自己知道是啥意思就行)
Step2:在Run框中输入:
"C:\Program Files\LLVM\bin\clang-format.exe" -style=file -fallback-style=none -i %f
(也许clang-format.exe的安装路径不尽相同,需要按照是自己的实际安装路径写)
Step3:勾选
Save Files First
和
Wait Until Done
Step4:为该命令分配快捷键,点击 Custom Commands 页面右下角
Keys...
,选择刚才创建好的 Custom Cmd: clang-format,点击
Assign New Key
,此时你可以敲自己喜欢的快捷键,比如 Ctrl+Alt+F,最后点击 OK 就大功告成
Step5:敲 “Step4” 定义的快捷键,就可以对当前的文件格式化了(当前目录或者更上级目录要存在 .clang-format)
3. 在VS Code中添加clang-format
Step1:安装C/C++插件(这个插件在vscode中基本属于必装的插件)
Step2:设置 / 扩展 / C/C++ / 格式设置
Step3:勾选“Editor:Format On Save”,这样没当文件保存(ctrl+s)就会调用 clang-format.exe 去格式化代码了(当前目录或者更上级目录要存在 .clang-format)。
4. 格式化脚本.clang-format
更详细的命令解释可参考官网:https://clang.llvm.org/docs/ClangFormat.html
# Format Style Options - Created with Clang Power Tools
# clang的官网:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
---
# 指定基本的风格样式,实际开发时无需从头开始指定所有的格式,可以选择LLVM、Google、Chromium、Mozilla、WebKit、Microsoft、GNU
# 中的一种或多种风格,用“|”将其连接在一起
BasedOnStyle: LLVM
UseTab: Never # 从不使用Tab键
SortIncludes: false # 不对include进行排序
IndentWidth: 4 # 缩进的空格数,这里配置默认所见4个空格
MaxEmptyLinesToKeep: 1 # 要保留的连续空行数,值为0则不关心空行数
ColumnLimit: 120 # 列数限制,当值为0时,不对对列数进行任何的限制,当非0时,则当一行代码达到指定列数之后,开始换行
ReflowComments: true # 是否重新排版注释,true - 重排注释,false - 不重排注释(一般只要单行超过最大列数之后才会重排)
IndentCaseLabels: true # case相对于switch是否要缩进,true:缩进,false:不缩进
ContinuationIndentWidth: 4 # 延续下一行的缩进宽度,只原来一行放不下时,换行后,新行缩进的字符数
BreakBeforeBinaryOperators: None # 二元操作符断行策略(在操作符之后断行)
BreakBeforeTernaryOperators: false # 三元操作符断行规则(true:三元操作符将放在换行符之后 , false:三元操作符将放在换行符之前)
AccessModifierOffset: -4 # 访问修饰符(public、private等)的偏移字符数
AlignTrailingComments: true # 对齐尾部注释
AlignConsecutiveAssignments: false # 连续赋值的对其策略(可以跨过空格及注释进行对齐)
AlignConsecutiveMacros: AcrossEmptyLinesAndComments # 连续宏定义对齐策略(可以跨过空格及注释进行对齐)
# 关于大括号的处理策略
BreakBeforeBraces : Custom # 只有设置为Custom时,才使用它来指定应该如何处理每个独立的大括号情况。否则,它将被忽略。
BraceWrapping:
AfterCaseLabel: true # 在case之后大括号换行
AfterControlStatement: true # 对语句if/for/while/switch/...的换行风格控制,换行
AfterExternBlock: false # 在extern声明之后换行,这个不能换行,一旦换行,格式就不好看了
AfterFunction: true # 在函数定义之后大括号换行
BeforeElse: true # 在else之后大括号换行
#BeforeWhile: true # 在while之前换行
AfterEnum: true # 在enum定义之后大括号换行
AfterStruct: true # 在struct定义之后大括号换行
AfterUnion: true # 在union定义之后大括号换行
SplitEmptyFunction: false # false:空函数体的大括号{}在一行中,ture:大括号在两行中
# 缩进Goto跳转符号,fasle:不缩进,顶格,true:缩进
IndentGotoLabels: false
# 以下是是否将代码合并到单行中的控制策略,true:合并到一行,false:不合并到一行中
AllowShortCaseLabelsOnASingleLine: false # 对case内容的控制
AllowShortIfStatementsOnASingleLine: false # 对if的单行控制,只有对if没有{}的语句起作用
AllowShortLoopsOnASingleLine: false # 是否允许合并短循环到单行上
AllowShortBlocksOnASingleLine: false # 是否允许短语法块放在单行上
AllowShortEnumsOnASingleLine: false # 是否允许短的枚举放在一行上
AllowShortFunctionsOnASingleLine: None # 允许短函数在单行上,可以选择以下值:None,InlineOnly,Empty,Inline,ALL
...
参考文档:
- https://clang.llvm.org/docs/ClangFormat.html
- https://releases.llvm.org/download.html
- clang-format 使用与集成介绍
- 【C++】Clang-Format:代码自动格式化(看这一篇就够了)