哪个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格式样式规则控制了这些规则以及哪些版本可用?
答案 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样式没有那种错误的行为。