如何使 clang-format 在打开函数大括号之前添加新行?

问题描述 投票:0回答:2

我有兴趣为函数添加左大括号(但不是 if 语句和其他上下文)。例如

void foo()
{
   ...
}

撇开争论不谈,是否有这样做的充分理由?虽然我对 if/else 和较小的块使用同行开括号,但我认为在这种情况下,较大代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性。

此外,如何让 clang-format 遵循这种风格?

coding-style clang clang-format
2个回答
77
投票

文档所述,使用

clang-format
调用
-style=file
,并使用放置在封闭目录中的
.clang-format
文件来自定义样式选项。指定大括号位置的格式样式选项称为
BreakBeforeBraces
。从文档中,

大括号前打断 (

BraceBreakingStyle
)

支撑打破风格

使用。

可能的值:

  • BS_Attach
    (在配置中:
    Attach
    )始终将大括号附加到周围的上下文。
  • BS_Linux
    (在配置中:
    Linux
    )与
    Attach
    类似,但在函数、命名空间和类定义的大括号之前断开。
  • BS_Stroustrup
    (在配置中:
    Stroustrup
    )与
    Attach
    类似,但在函数定义和“else”之前中断。
  • BS_Allman
    (配置中:
    Allman
    )始终在大括号之前断开。
  • BS_GNU
    (在配置中:
    GNU
    )始终在大括号之前断开,并在控制语句的大括号中添加额外的缩进级别,而不是 那些类、函数或其他定义。

符合您描述的样式是

BS_Stroustrup
。将以下条目添加到您的
.clang-format

BreakBeforeBraces: Stroustrup

除了文档之外,clang.llvm.org还列出了所有选项并通过示例说明了其中许多选项。


34
投票

Pradhan 有一个优秀的答案,但你可能会发现你在不想要的地方得到了休息(正如我发现的那样)。

至少在 clang 格式版本 3.8 和 5 中还有另一个选项“自定义”(我使用的是 3.8,并在 5 个文档中找到了 BS_Custom)。这样,您就可以在 BraceWrapping 中指定您想要的内容,包括“AfterFunction”选项。

在下面的示例摘录中,我将其他列为真/假,因为OP的问题仅指定AfterFunction(即“在函数的左大括号之前”):

BraceWrapping:
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true/false
  AfterFunction:   true
  AfterNamespace:  true/false
  AfterObjCDeclaration: true/false
  AfterStruct:     true/false
  AfterUnion:      true/false
  BeforeCatch:     true/false
  BeforeElse:      true/false
  IndentBraces:    true/false
BreakBeforeBraces: Custom

我已经用我的配置对此进行了测试,它提供了对支撑破坏的更细粒度的控制。

© www.soinside.com 2019 - 2024. All rights reserved.