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

Posted

技术标签:

【中文标题】如何在打开函数的大括号之前使 clang-format 添加新行?【英文标题】:how to make clang-format add new line before opening brace of a function? 【发布时间】:2015-06-11 05:27:23 【问题描述】:

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

void foo()

   ...

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

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

【问题讨论】:

【参考方案1】:

正如documentation 所说,使用-style=file 调用clang-format,并使用放置在封闭目录中的.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

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

【讨论】:

非常感谢。顺便说一句,Bjarne 将“else”作为例外的理由是什么? Stroustrup 是最佳选择。 +1【参考方案2】:

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

至少在 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

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

【讨论】:

以上是关于如何在打开函数的大括号之前使 clang-format 添加新行?的主要内容,如果未能解决你的问题,请参考以下文章

使用Source Insight 在函数名后回车,加括号的时候,如何在回车后括号直接与函数对其?要如何设置?

wps打数学方程组的大括号怎么打?

excel使用技巧

LaTex中如何输入大括号(左边的),并输入2行内容

编写一个函数,在开头和结尾添加括号,使所有括号匹配并返回

mathtype表示分类的大括号怎么打?