clang 格式的样式选项文档包括许多称为 PenaltyXXX 的选项。文档没有解释应该如何使用这些惩罚。你能描述一下如何使用这些惩罚值以及它们达到什么效果(也许有一个例子)?
2 回答
当您的行超过行长限制时,clang-format 将需要在某处插入一个或多个中断。您可以将惩罚视为阻止某些断线行为的一种方式。例如,假设您有:
Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(args);
// and the column limit is here: ^
Clang-format 可能会格式化看起来有点奇怪:
Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(
args);
在这种情况下,您可能决定愿意将行长违反一两个字符,因此您可以通过将 设置PenaltyExcessCharacter
为较低的数字和PenaltyBreakBeforeFirstCallParameter
较高的数字来控制这一点。
就个人而言,我真的不喜欢返回类型在自己的行中,所以我设置PenaltyReturnTypeOnItsOwnLine
了一个荒谬的大数字。
顺便说一句,这个系统是从 Latex 继承的,它允许你指定各种对换行、分页和断字的惩罚。
你能描述一下如何使用这些惩罚值以及它们达到什么效果(也许有一个例子)?
您可以在这个 Git 2.15(2017 年第四季度)中看到一个clang-format
用C 编写的 Git 项目的示例:
请参阅Johannes Schindelin ( )的提交 42efde4(2017 年 9 月 29 日) 。(由Johannes Schindelin 合并 -- --在提交 42efde4中,2017 年 10 月 1 日)dscho
dscho
您可以在此处查看旧值和新值:
为了说明这些值:
clang-format
: 调整换行惩罚我们真的,真的,真的想将每行的列数限制为 80:Git 邮件列表上为数不多的一致风格评论之一是每行不应超过 80 列(即使 79 列/行会更有意义,因为代码经常被视为差异,并且差异添加了一个额外的字符)。
但是,正如 Brandon Williams 所指出的那样,对多余字符的 5 罚分太低了,无法保证这一点。
(看到这个线程)
从现有的 clang 格式示例和文档来看,100 似乎是被认为适合 的惩罚
Stuff You Really Don't Want
,所以让我们将其指定为“多余字符”的惩罚,即过长的行。在此期间,进一步调整惩罚:我们实际上并不热衷于防止注释或字符串文字中的换行符,因此 100 的惩罚似乎非常高。
同样,我们也不是那么坚持让换行符远离赋值运算符(很多 Git 的代码在
=
字符之后立即中断只是为了保持 80 列/行的限制)。我们确实对函数的返回类型在它们自己的行上比惩罚 0 所暗示的更皱眉,所以这也被调整了。
最后,我们并不特别喜欢在调用的第一个参数之前中断,但是如果它使行短于 80 列/行,这就是我们所做的,因此降低在调用的第一个参数之前中断的惩罚,但不完全像就像在评论中引入新的换行符一样。