1. 如何在VSCode中对代码格式化
打开一个test.cpp文件,在文件中右击-格式化文档,或按Alt+Shift+F
可以对当前文件执行格式化操作(不同VSCode版本的快捷键可能不一样),比如
- 自动调整缩进
- 自动调整大括号的位置
- 自动调整换行限制宽度等
文件 - 偏好 - 设置,搜索clang_format, 可以看到一个配置选项,默认为Visual Studio
,可以换成LLVM
、Google
、Mozilla
等,也可以设置为自定义的配置参数。
我习惯的格式为:{BasedOnStyle: WebKit, ColumnLimit: 100, BreakBeforeBraces: Stroustrup, SortIncludes: false, AllowShortFunctionsOnASingleLine: All}
。主要特点是:
- 4空格缩进
- if for语句后的大括号
{
在同一行 - 以及function, class, namespace的风格都比较顺眼
- 参考:https://clang.llvm.org/docs/ClangFormatStyleOptions.html
相关的插件应该只装了微软的3个C/C++插件:
2. 常见的 Base Style - 不同格式化风格的主要特点
- Visual Studio: 和下面几个的主要区别是命名空间内的东西会有缩进,其他几个都是和namespace同一缩进。
namespace test { template <typename T> void print(T &&t) { std::cout << t << std::endl; } } // namespace test
- LLVM: template和返回值与函数名在同一行;另外会把单行函数格式化为单行
template <typename T> void print(T &&t) { std::cout << t << std::endl; }
- Google、Chromium:类的访问限制符
public
、private
和class
不对齐class Test { public: Test(std::string name) : name_(std::move(name)) {} void run() { std::cout << "Running test " << name_ << "..." << std::endl; run_(); std::cout << "Test " << name_ << " passed." << std::endl; } private: std::string name_; }
- Mozilla、GNU: 函数定义处,会把函数返回值的类型放到上一行
template<typename T> void print(T&& t) { std::cout << t << std::endl; }
- WebKit:和其他几个的主要区别是默认4空格缩进,而且大括号单独一行,其他都是2空格,大括号在行尾,算是最符合我习惯的,调整大括号位置即可。
- WebKit 是一个跨平台的 Web 浏览器引擎,苹果的 Safari、谷歌的 Chrome 浏览器都是基于这个框架来开发的。
3. 其他 clang format 风格选项
https://clang.llvm.org/docs/ClangFormatStyleOptions.html
3.1 大括号位置
- 可通过参数字段
BreakBeforeBraces
指定大括号{
、}
的位置,有几个值可选:-
Linux: 最符合我的习惯
if (...) { printf(...); } else { printf(...); }
-
Stroustrup: C++祖师爷的风格,主要特点是每个分支占有独立的行方便剪切复制分支块,并且不会过多浪费纵向屏幕空间
if (...) { printf(...); } else { printf(...); }
-
Allman: 会把大括号
{
单独放到下一行,我觉得很浪费纵向屏幕空间,不利于代码的阅读理解if (...) { printf(...); } else { printf(...); }
-