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

Clang Format Rule for Nested Struct Fields

本文关键字:格式 规则 clang 结构 字段 嵌套      更新时间:2023-10-16

哪个 clang 格式样式选项控制 clang 如何格式化嵌套结构字段? 如果没有,是否有任何已知的解决方法?

考虑以下假程序

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

我们有一些安装了 clang 格式 3.8 的旧构建环境。 当我们在上面的程序上运行 clang 格式时,嵌套的结构字段最终会在同一行上

$ clang-format sample.c 
/* ... */
.params =
{
.start = {.stamp = 1, .when = 1}, .url = "https://httpbin.org/",
},
/* ... */

但是,当使用 clang 格式 6.0.0 时,这些嵌套字段最终位于不同的行上。

$ clang-format sample.c 
/* ... */
.params =
{
.start = {.stamp = 1, .when = 1},
.url = "https://httpbin.org/",
},
/* ... */
}

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

通常,clang-format 会将结构字段放在不同的行上,就像在原始代码中一样,就像在 clang-format-6.0 的输出中一样。

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

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

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

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