如何配置clang-format避免格式化大括号,满足自定义换行需求?
如何让clang-format在构造函数初始化列表后单独换行大括号?
问题背景
我希望代码中大括号默认与前一行相连,但在构造函数初始化列表这类场景下,让大括号单独换行。
当前clang-format生成的不美观格式:
constexpr vector(vector&& other) : alloc_ { ::std::move(other.alloc_) }, data_begin_ { other.data_begin_ }, data_end_ { other.data_end_ }, storage_end_ { other.storage_end_ } { other.data_begin_ = other.data_end_ = other.storage_end_ = {}; }
期望的优化格式:
constexpr vector(vector&& other) : alloc_ { ::std::move(other.alloc_) }, data_begin_ { other.data_begin_ }, data_end_ { other.data_end_ }, storage_end_ { other.storage_end_ } { other.data_begin_ = other.data_end_ = other.storage_end_ = {}; }
试过用//clang-format off但会禁用其他格式规则,查文档没找到专门的选项,BreakBeforeBraces没有保留原有格式的取值,注释后clang-tidy仍用默认attach格式,求解决办法。
解决方案
通过.clang-format的自定义大括号换行规则可以实现:
在配置文件中设置BreakBeforeBraces: Custom,然后在BraceWrapping中针对初始化列表场景单独开启换行,同时保持其他场景的大括号紧跟前一行:
BreakBeforeBraces: Custom BraceWrapping: AfterFunction: false # 普通函数大括号紧跟前一行 AfterInitializerList: true # 初始化列表后单独换行放大括号 AfterNamespace: false # 命名空间大括号紧跟前一行 AfterClass: false # 类定义大括号紧跟前一行 # 其他场景可按需调整,比如AfterControlStatement、AfterEnum等
这个配置会精准控制:
- 绝大多数场景(函数、类、命名空间等)的大括号保持和前一行相连
- 构造函数初始化列表结束后的大括号单独换行,完全匹配你想要的格式
如果还有其他特殊场景需要调整,直接在BraceWrapping下添加对应的开关即可,clang-format支持对几乎所有代码块的大括号换行做精细控制。
内容的提问来源于stack exchange,提问作者fantasy
相关产品推荐
相关产品推荐

