文档
clang-format是clang中的一个工具
官方文档
https://clang.llvm.org/docs/ClangFormat.html
其配置文件的官方文档
https://clang.llvm.org/docs/ClangFormatStyleOptions.html
功能
支持的语言:C/C++/Java/JavaScript/Objective-C/Protobuf/C#
内置几种主流编程法的配置 LLVM Google Chromium Mozilla WebKit Microsoft
可应用于:Vim / Emacs / BBEdit / CLion / Visual Studio / VSCode / Xcode 等IDE或者编辑器,
每个编辑器如何配置官方文档上有介绍一些,另外网上也有许多文章, VSCode在设置中搜索clang可以看到它的几个clang-format的相关配置,
修改它们可以相应修改代码格式化的样式。
安装
ubuntu sudo apt-get install clang-format
opensuse 安装clang会带
还有用npm安装也是可以的,sudo npm install clang-format
配置
可用以下命令得到内置配置的内容, 比如llvm的
clang-format -style=llvm -dump-config > .clang-format
Virtual Studio的代码风格:
这个是从Vscode中的设置中得到的
{
BasedOnStyle: LLVM,
UseTab: Never,
IndentWidth: 4,
TabWidth: 4,
BreakBeforeBraces: Allman,
AllowShortIfStatementsOnASingleLine: false,
IndentCaseLabels: false,
ColumnLimit: 0,
AccessModifierOffset: -4
}
使用
手动执行代码格式化:
- 指定某种风格
clang-format -style=google -i test.cpp - 在源码当前或者父目录放有自定义的配置文件.clang-format
clang-format -i test.cpp
示例
有些格式化方式可能不是我们想要的,这个时候可修改.clang-format自定义, 有些时候某些效果定制不出来,就得进行取舍
比如下面例子:
配置:
BreakBeforeBinaryOperators: NonAssignment
ColumnLimit: 0
BreakBeforeBraces: Allman
…其他的配置忽略, 上面Allman是为了让大括号{}单独成一行
原始代码:
void doxx()
{
if (startPower > 0
&& endPower > 0
&& startTime != 0
&& (endTime - startTime) >= 1200)
{
}
std::cout << info << " now: " << now
<< " prev sendtime: " << sendTime << " needReSend: " << needReSend
<< " code: " << ret.code << " body: " << ret.body;
}
void doxx2()
{
if (startPower > 0 &&
endPower > 0 &&
startTime != 0 &&
(endTime - startTime) >= 1200)
{
}
std::cout << info << " now: " << now <<
" prev sendtime: " << sendTime << " needReSend: " << needReSend <<
" code: " << ret.code << " body: " << ret.body;
}
格式化后:
void doxx()
{
// 这里变有变化
if (startPower > 0
&& endPower > 0
&& startTime != 0
&& (endTime - startTime) >= 1200)
{
}
std::cout << info << " now: " << now
<< " prev sendtime: " << sendTime << " needReSend: " << needReSend
<< " code: " << ret.code << " body: " << ret.body;
}
void doxx2()
{
// 这里变化了
if (startPower > 0 && endPower > 0 && startTime != 0 && (endTime - startTime) >= 1200)
{
}
// 这里变成一长行, 太长了
std::cout << info << " now: " << now << " prev sendtime: " << sendTime << " needReSend: " << needReSend << " code: " << ret.code << " body: " << ret.body;
}
可以发现doxx2()中的本来是多行,变成一行了,为什么,因为前面 BreakBeforeBinaryOperators: NonAssignment的意思是要在二元操作符前换行,而代码却在操作符之后换行,
与配置文件不一致,但是clang-format又不够智能去把操作符从后换行变成前换行,只是单纯的变为一个长行了, 这种变化就不是我们想要的结果,一行代码太长了。
这个时候如果改 ColumnLimit: 0 为 ColumnLimit: 80
效果就会变成如下:
void doxx()
{
// 注意为了不变为一个长行,这里也变了, 这里就是一个取舍的地方
if (startPower > 0 && endPower > 0 && startTime != 0
&& (endTime - startTime) >= 1200)
{
}
std::cout << info << " now: " << now << " prev sendtime: " << sendTime
<< " needReSend: " << needReSend << " code: " << ret.code
<< " body: " << ret.body;
}
void doxx2()
{
if (startPower > 0 && endPower > 0 && startTime != 0
&& (endTime - startTime) >= 1200)
{
}
// 这里不再变为一个长行,看起来就舒服许多
std::cout << info << " now: " << now << " prev sendtime: " << sendTime
<< " needReSend: " << needReSend << " code: " << ret.code
<< " body: " << ret.body;
}
团队代码规范/格式化工具clang-format一
团队代码规范/格式化工具clang-format二
团队代码规范/格式化工具clang-format三
作者:帅得不敢出门