团队代码规范/格式化工具clang-format一

文档

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
}

使用

手动执行代码格式化:

  1. 指定某种风格
    clang-format -style=google -i test.cpp
  2. 在源码当前或者父目录放有自定义的配置文件.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三
作者:帅得不敢出门

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值