clang-format使用Allman风格时如何为命名空间大括号前后添加空行
解决方案
目前可以通过两种方式实现你需要的Allman风格命名空间空行效果:
方案1:升级到Clang-Format 14及以上版本(推荐)
Clang-Format从14版本开始新增了专门的命名空间空行控制配置,和BreakBeforeBraces: Allman规则完全兼容,你只需要在现有配置中新增两行配置即可:
EmptyLineAfterNamespace: true EmptyLineBeforeNamespaceClosing: true
修改后的完整配置如下:
--- BasedOnStyle: Google AccessModifierOffset: -4 AlignConsecutiveDeclarations: 'true' BinPackArguments: 'false' BinPackParameters: 'false' IndentWidth: '4' AlignConsecutiveAssignments: 'true' ColumnLimit: 120 BreakBeforeBraces: Allman AllowShortIfStatementsOnASingleLine: false # 新增命名空间空行配置 EmptyLineAfterNamespace: true EmptyLineBeforeNamespaceClosing: true ...
配置完成后重新执行格式化,就能直接输出你预期的代码格式:
namespace test_a::test_b { struct A { int a; int b; }; } // namespace test_a::test_b
方案2:低版本Clang-Format兼容方案
如果你暂时无法升级到14及以上版本,可以在clang-format格式化完成后,通过正则替换做二次处理实现效果,处理逻辑如下:
- 匹配命名空间左大括号后直接跟非空行的场景,替换为左大括号+空行+原内容
- 匹配命名空间右大括号前没有空行的场景,替换为空行+右大括号
你可以把上述逻辑封装为脚本,和clang-format绑定执行即可。
内容的提问来源于stack exchange,提问作者DontCareBear
相关产品推荐
相关产品推荐

