【问题标题】:Break after control statements in clang-format以clang格式的控制语句后中断
【发布时间】:2015-12-30 15:57:57
【问题描述】:

我在我的.clang-format 文件中使用了BreakBeforeBraces: Allman,但控制语句中的大括号(例如ifforwhile,...)没有放在自己的行中。

// Currently:
void foo()
{
    while(true) {
        bar();
    }
}

// What I want:
void foo()
{
    while(true) 
    {
        bar();
    }
}

I've read that 您可以在BraceWrapping 中为大括号设置嵌套配置类,但我无法找出正确的 YAML 语法(以及 sublime 文本插件的 JSON 语法),并且找不到任何现有示例。

有什么办法吗?

【问题讨论】:

  • 当我在您的示例上运行 clang-format -i -style="{BreakBeforeBraces: Allman}" test.cpp 时,它会将所有大括号放在自己的行上,就像您对 Allman 样式所期望的那样。你看到别的了吗?
  • @RichardViney:你说得对……我做了一些测试,结果发现AllowShortLoopsOnASingleLine: true 是这个问题的罪魁祸首。将其设置为 false 可使格式化按预期工作。这是一个错误吗?
  • 不,我不认为这是一个错误,实际上还有其他样式选项,例如 AllowShortFunctionsOnASingleLineBreakBeforeBraces: Allman 一起使用时也会允许大括号有时并不总是有一行在特定条件下对自己。如果您想要超严格的 Allman 牙套,您还需要检查这些其他样式。
  • 但是,例如,AllowShortLoopsOnASingleLine 选项是bool,并且只允许truefalse。它确实会影响 Allman 大括号 (如原始问题所示),即使循环实际上并未转换为一行。
  • @RichardViney:我做了更多的测试并弄清楚了样式的组合 - 我打开了一个错误报告:llvm.org/bugs/show_bug.cgi?id=25069

标签: c++ formatting clang libclang clang-format


【解决方案1】:

目前,通过特定的样式选项组合来实现所需的结果是不可能的。我已经举报了the issue as bug 25069

【讨论】:

  • 现在当 BraceWrapping 设置为自定义时,clang-format-3.8 似乎有单独的中断选项。
  • 这仍然是 clang-format 5.0.1 的错误。组合键是AllowShortBlocksOnASingleLine: true 和任何其他AllowShort...OnASingleLine 选项。设置这两个选项似乎否定了 Allman 大括号样式。如果AllowShortBlocksOnASingleLine: false,那么您可以随心所欲地控制。
【解决方案2】:

为了解决这个问题,我首先运行 artistic style 和选项 -A10,然后运行 ​​clang-format

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2022-11-08
    • 1970-01-01
    • 2020-04-05
    • 2022-09-27
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多