38

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

void foo()
{
   ...
}

抛开火焰大战不谈,不这样做有什么好的理由吗?尽管我对 if/else 和更小的块使用同行开括号,但我认为在这种情况下,更大的代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性。

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

4

2 回答 2

58

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

BreakBeforeBraces ( BraceBreakingStyle)

要使用的大括号断开样式。

可能的值:

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

符合您描述的样式是BS_Stroustrup。将以下条目添加到您的.clang-format

BreakBeforeBraces: Stroustrup

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

于 2015-04-08T02:32:03.253 回答
26

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

我已经用我的配置对此进行了测试,它可以更精细地控制大括号断裂。

于 2017-03-25T20:54:43.460 回答