引言

有不少工具用于统一项目编码风格,比如Go语言自带fmt模块统一编码风格,又比如C++有astyle这样的工具,但这里要介绍的是clang-format工具。

安装:

$ sudo yum install clang-format git-clang-format

如果是源码安装,在llvm-project/clang/目录下:

$ mkdir build && cd build/
$ cmake ../
$ make clang-format

同时还提供了其它工具对应的版本:

llvm-project/clang/tools/clang-format/clang-format-bbedit.applescript
llvm-project/clang/tools/clang-format/clang-format-diff.py
llvm-project/clang/tools/clang-format/clang-format-sublime.py
llvm-project/clang/tools/clang-format/clang-format-test.el
llvm-project/clang/tools/clang-format/clang-format.el
llvm-project/clang/tools/clang-format/clang-format.py
llvm-project/clang/tools/clang-format/git-clang-format

生成风格配置文件

以llvm和google为例:

$ clang-format -style=llvm   -dump-config > .clang-format
$ clang-format -style=google -dump-config > .clang-format

有了.clang-format风格配置文件,命令clang-format就会自动读取此配置文件,编辑器vscode只要安装了vs-clang-format插件也会自动读取此配置。

修改文件风格

$ clang-format filename.cpp     # 只对比不修改文件
$ clang-format -i filename.cpp  # 直接修改文件

git自动clang-format

需要依赖git-clang-format:

$ git clang-format

它会自动对暂存区的文件进行风格转换,也可以配置git-hooks让执行git commit的时候自动进行转换。

添加文件.git/hooks/pre-commit:

#!/bin/sh

git clang-format

这样就不怕忘记执行clang-format了。

部分代码不想被格式化

int formatted_code;

// clang-format off
    void    unformatted_code  ;
// clang-format on

void formatted_code_again;

通过注释的方式告诉clang-format不要因为代码风格而改动这部分代码。

.clang-format配置项

几个配置:

BasedOnStyle:  LLVM           # 基于LLVM风格
AlignAfterOpenBracket: Align  # 括号后跨行对齐
ColumnLimit:     0            # 行字符数量无限制
IndentCaseLabels: true        # case缩进
IndentWidth:     4            # 4格缩进
NamespaceIndentation: All     # 名字空间缩进
TabWidth:        4            # TAB长度
UseTab:          Never        # 不使用TAB
Language:        Cpp
Standard:        c++17

不管使用什么风格,只要保持一致即可。