我有兴趣为函数添加一个左大括号(但不是 if 语句和其他上下文)。例如
void foo()
{
...
}
抛开火焰大战不谈,不这样做有什么好的理由吗?尽管我对 if/else 和更小的块使用同行开括号,但我认为在这种情况下,更大的代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性。
此外,我如何让 clang-format 遵循这种风格?
我有兴趣为函数添加一个左大括号(但不是 if 语句和其他上下文)。例如
void foo()
{
...
}
抛开火焰大战不谈,不这样做有什么好的理由吗?尽管我对 if/else 和更小的块使用同行开括号,但我认为在这种情况下,更大的代码单元(函数/方法/类/结构)的可视化组织可以胜过完美的一致性。
此外,我如何让 clang-format 遵循这种风格?
正如文档所说,调用clang-format
with-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 还列出了所有选项,并通过示例说明了其中的许多选项。
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
我已经用我的配置对此进行了测试,它可以更精细地控制大括号断裂。