如何在打开函数的大括号之前使 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 添加新行?的主要内容,如果未能解决你的问题,请参考以下文章