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

daj*_*daj 15 coding-style clang clang-format

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

void foo()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

除了Flamewars之外,还有一个很好的理由这样做吗?虽然我对if/else和less块使用相同的开放括号,但我认为在这种情况下,更大的代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性.

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

Pra*_*han 20

由于文档说,调用clang-format-style=file,并使用一个.clang-format放置在一个封闭的目录文件自定义样式选项.调用指定括号放置的格式样式选项BreakBeforeBraces.从文档中,

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
Run Code Online (Sandbox Code Playgroud)

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

  • `Stroustrup` 是最好的选择。+1 (3认同)

sag*_*age 12

Pradhan有一个很好的答案,但你可能会发现你在不想要它们的地方休息(正如我发现的那样).

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

在下面的示例摘录中,我将其他列为true/false,因为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
Run Code Online (Sandbox Code Playgroud)

我已经用我的配置测试了它,并且它提供了更精细的支撑破碎控制.