嵌套结构字段的Clang格式规则

时间:2018-02-02 16:42:44

标签: c++ c clang clang-format

哪个clang format style option控制clang如何格式化嵌套结构字段?如果没有,那么下面是否有任何已知的工作?

考虑以下虚假程序

void main()
{
    /* ... */
    struct_type thing = {
        .foo = foo,
        .params =
            {
                .start = {.stamp = 1, .when = 1},
                .url = "https://httpbin.org/",
            },
    };
}

我们有一些安装了clang-format 3.8的旧版本环境。当我们在上面的程序中运行clang-format时,嵌套的struct字段最终在同一行

$ clang-format sample.c 

/* ... */
      .params =
          {
              .start = {.stamp = 1, .when = 1}, .url = "https://httpbin.org/",
          },
/* ... */

但是,使用clang-format 6.0.0时,这些嵌套字段最终会出现在不同的行上。

$ clang-format sample.c 

/* ... */

      .params =
          {
              .start = {.stamp = 1, .when = 1},
              .url = "https://httpbin.org/",
          },
/* ... */

}

有没有人知道哪个(如果有的话)clang格式样式规则控制了这些规则以及哪些版本可用?

1 个答案:

答案 0 :(得分:1)

通常,clang-format会将struct字段放在不同的行上,如原始代码和clang-format-6.0的输出。

我无法明确地找到控制它的选项。

然而,clang-format-3.8强制同一行上的字段似乎是一个bug 有一个名为BreakBeforeBinaryOperators的字段,用于控制二元运算符的包装(请参阅clang-format 3.8 documentation)。该字段默认为None,它告诉clang格式在二元运算符之前不要中断。问题是,clang-format错误地识别了这个结构,它只有两个字段,作为二元运算符...

因此,要解决clang-format 3.8的问题,请将BreakBeforeBinaryOperators设置为All。这会产生改变二元运算符换行方式的副作用,但希望这是可以接受的(因为二进制表达式超出列限制可能并不常见)。

希望这有帮助。
顺便说一句,我发现这是通过比较3.8和3.8的--dump-config输出与-style=webkit,一旦我意识到webkit样式没有那种错误的行为。