我有兴趣为函数添加左大括号(但不是 if 语句和其他上下文)。例如
void foo()
{
...
}
撇开争论不谈,是否有不这样做的充分理由?虽然我对 if/else 和较小的块使用同行开括号,但我认为在这种情况下,较大代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性。
此外,如何让 clang-format 遵循这种风格?
如文档所述,使用
clang-format
调用-style=file
,并使用放置在封闭目录中的.clang-format
文件来自定义样式选项。指定大括号位置的格式样式选项称为 BreakBeforeBraces
。从文档中,
大括号前打断 (
)BraceBreakingStyle
支撑打破风格
使用。
可能的值:
(在配置中:BS_Attach
)始终将大括号附加到周围的上下文。Attach
(在配置中:BS_Linux
)与Linux
类似,但在函数、命名空间和类定义的大括号之前断开。Attach
(在配置中:BS_Stroustrup
)与Stroustrup
类似,但在函数定义和“else”之前中断。Attach
(配置中:BS_Allman
)始终在大括号之前断开。Allman
(在配置中:BS_GNU
)始终在大括号之前断开,并在控制语句的大括号中添加额外的缩进级别,而不是 那些类、函数或其他定义。GNU
符合您描述的样式是
BS_Stroustrup
。将以下条目添加到您的 .clang-format
BreakBeforeBraces: Stroustrup
除了文档之外,clang.llvm.org还列出了所有选项并通过示例说明了其中许多选项。
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
我已经用我的配置对此进行了测试,它提供了对支撑破坏的更细粒度的控制。