跳到主要内容

代码格式化

· 阅读需 6 分钟
阅读量: 101阅读人次: 102

工具几年,发现在 C/C++ 开发中,可能是待得公司体量都不大吧,很少看到有同事使用代码格式化工具,是的代码格式风格整齐统一,这其实给其他人接手阅读时会带来很大的帮助。

平时团队进行合作的时候需要注意代码的格式,虽然很难统一每个人的编码风格,但是通过工具能够很好的管理代码格式。

这里介绍下clang-format,它是基于clang的一个命令行工具,能够自动化格式C/C++/Obj-C代码,支持多种代码风格:Google, Chromium, LLVM, Mozilla, WebKit,也支持自定义风格(通过编写.clang-format文件)很方便的统一代码格式。

使用方法

  • Linux下下安装clang-format :

    sudo apt-get install clang-format
  • 以LLVM代码风格格式化main.cpp, 结果直接写到main.cpp

    clang g-format -i main.cpp -style=LLVM
  • 当然也支持对指定行格式化,格式化main.cpp的第1,2行

    clang-format -lines=1:2 main.cpp

配置文件说明

配置文件 .clang-format 详细说明

# 基于那个配置文件
BasedOnStyle: LLVM
# 访问说明符的偏移(public private)
AccessModifierOffset: -4
# 括号之后,水平对齐参数: Align DontAlign AlwaysBreak
AlignAfterOpenBracket: Align
# 连续的赋值时,对齐所有的等号
AlignConsecutiveAssignments: true
# 连续声明时,对齐所有声明的变量名
AlignConsecutiveDeclarations: true
# 左对齐换行(使用反斜杠换行)的反斜杠
AlignEscapedNewlinesLeft: true
# 水平对齐二元和三元表达式的操作数
AlignOperands: true
# 对齐连续的尾随的注释
AlignTrailingComments: true
# 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: true
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine : false
# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中,空函数), All
AllowShortFunctionsOnASingleLine: Empty
# 是否允许短if单行 If true, if (a) return; 可以放到同一行
AllowShortIfStatementsOnASingleLine: false
# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine: false
# 总是在定义返回类型后换行(deprecated)
AlwaysBreakAfterDefinitionReturnType: None
# 每行字符的限制,0表示没有限制
ColumnLimit: 100
# 描述具有特殊意义的注释的正则表达式,它不应该被分割为多行或以其它方式改变
CommentPragmas: '^ IWYU pragma:'
# 语言: None Cpp Java Objc Protp
Language: Cpp
#指针的*的挨着哪边
PointerAlignment: Right
#缩进宽度
IndentWidth: 4
# 连续的空行保留几行
MaxEmptyLinesToKeep: 1
# 在 @property 后面添加空格, \@property (readonly) 而不是 \@property(readonly).
ObjCSpaceAfterProperty: true
# OC block后面的缩进
ObjCBlockIndentWidth: 4
# 是否允许短方法单行
AllowShortFunctionsOnASingleLine: false
# 换行的时候对齐操作符
#AlignOperands: true
# 中括号两边空格 []
SpacesInSquareBrackets: true
# 小括号两边添加空格
SpacesInParentheses : false
#等号两边的空格
SpaceBeforeAssignmentOperators: true
# 容器类的空格 例如 OC的字典
SpacesInContainerLiterals: true
#缩进
IndentWrappedFunctionNames: true
#在block从空行开始
KeepEmptyLinesAtTheStartOfBlocks: true
#在构造函数初始化时按逗号断行,并以冒号对齐
BreakConstructorInitializersBeforeComma: true
#括号后添加空格
SpaceAfterCStyleCast: false
# 允许排序#include, 造成编译错误
# SortIncludes: true
# 缩进case 标签
IndentCaseLabels: true
#tab键盘的宽度
TabWidth: 4
UseTab: Never

跳过格式化

对于不需要格式化的地方,加上下面两行注释即可,中间的代码就不会被格式化。

// clang-format off
QVector3D cubePositions[] = {
QVector3D(0.0f, 0.0f, 0.0f),
QVector3D(2.0f, 5.0f, -15.0f),
QVector3D(-1.5f, -2.2f, -2.5f),
QVector3D(-3.8f, -2.0f, -12.3f),
QVector3D(2.4f, -0.4f, -3.5f),

QVector3D(-1.7f, 3.0f, -7.5f),
QVector3D(1.3f, -2.0f, -2.5f),
QVector3D(1.5f, 2.0f, -2.5f),
QVector3D(1.5f, 0.2f, -1.5f),
QVector3D(-1.3f, 1.0f, -1.5f)
};
// clang-format on

IDE 下的使用

现在几乎现在的 IDE 都支持基于 clang-format 的代码格式化。只需要在项目根目录添加一个 .clang-format 文件,IDE 就会根据 IDE 的设置及该文件的内容适时(推荐对文件进行保存时)进行格式化。

Qt Creator

在【编辑】→【Preferences...】→【C++】→【代码风格】页面下:

  1. 将【Formatting mode】设置为 Full formatting
  2. 勾选【Format edited code on file save】。

Qt Creator 下默认只会格式化C++代码,如果要格式化C代码,需要在Restrict to MIME types中添加C源文件的MIME类型 text/x-csrc

VS Code

在项目根目录下的 .vscode/settings.json 添加如下内容:

.vscode/settings.json
{
"editor.formatOnSaveMode": "modificationsIfAvailable",
"editor.formatOnSave": true
}

进入 文件->首选项->设置 页面,然后搜索 clang。

"C_Cpp.clang_format_fallbackStyle": "LLVM"
"C_Cpp.clang_format_style": "file"