【发布时间】:2019-09-03 21:12:24
【问题描述】:
我想知道如何解决 clang-format 和 C++ 中更长的数学表达式遇到的一些奇怪问题。假设我们在test.h中保存了以下示例代码:
void TestFunction() {
int long_int_variable_name = 1;
int result = (long_int_variable_name + long_int_variable_name) * long_int_variable_name - 1;
}
我们可以通过以下方式使用 Google 样式对其进行格式化:
clang-format -style=google -dump-config > .clang-format
clang-format -i -style=file test.h
这会为result 生成一个格式相当笨拙的表达式:
void TestFunction() {
int long_int_variable_name = 1;
int result = (long_int_variable_name + long_int_variable_name) *
long_int_variable_name -
1;
}
看起来它在乘法的第二个操作数之前添加了一个行继续缩进,但在减法的第二个操作数之前已经对齐回行的开头。除此之外,为什么它甚至将1 带到了新的行列?看起来它试图根据数学优先级在视觉上将操作数更紧密/更松散地耦合,但它已经过火了。
所以这里的主要问题是
- 为什么 clang 决定以一种看似尴尬的方式来格式化它?
- 如何才能使这种类型的表达式格式更清晰,或者我可以使用哪些选项来使这种表达式看起来合理?
我认为仅当其余代码无法放入当前行时才换行将是一个很好的起点。之后,决定缩进的位置可能有助于改进它。
【问题讨论】:
-
您可以找到所有Clang-Format Style Options in the documentation,因此您可以编写自己的
.clang-format文件以获得您想要的任何行为(在工具的功能范围内)。您是否已经阅读过文档?如果不;这样做。 -
你读过文档了吗?
-
是的。当然。详细地。 多次。我们在我的工作场所使用 clang 格式,我们的
.clang-format文件经过多次修改和审查,我是它的主要作者。如果我没有仔细地彻底地阅读文档,那我就是疏忽了。 -
通常最好使用简单的格式化规则(像这样)来帮助处理 DIFFICULT 代码,即使对于您展示的简单代码示例来说它看起来有点过分。从长远来看,对于简单代码看起来“不错”但对复杂代码具有误导性的代码格式就没有多大用处了。如果您想要更复杂的格式(比如说)对于简单的代码看起来“不错”,但也有助于理解更复杂的代码,然后自己编写规则。您会发现对格式化规则本身进行编码会更加复杂。
-
阅读文档是一件非常痛苦的事情:阅读它一次需要大约 3 小时。如果 Stack Overflow 上有一个 5 分钟的答案,而我不是配置 .clang-format 文档的人,那么我会在任何一天阅读文档。我现在几乎完成了文档的阅读......所以回到它......
标签: c++ clang-format