clang-format 样式选项文档 包含一些名为 PenaltyXXX 的选项。该文档没有解释如何使用这些惩罚值。能否描述一下如何使用这些惩罚值及其实现的效果(可以举例说明)?
clang-format 样式选项文档 包含一些名为 PenaltyXXX 的选项。该文档没有解释如何使用这些惩罚值。能否描述一下如何使用这些惩罚值及其实现的效果(可以举例说明)?
当你的一行代码超过了长度限制时,clang-format需要在某处插入一个或多个换行符。你可以把惩罚看作是一种阻止某些换行行为的方式。例如,假设你有以下代码:
Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(args);
// and the column limit is here: ^
Clang-format 很可能会格式化得看起来有些奇怪:
Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(
args);
对于这类情况,你可能会决定容忍违反行长度一两个字符,因此您可以通过将PenaltyExcessCharacter
设置为一个较低的数字,而将PenaltyBreakBeforeFirstCallParameter
设置为一个较高的数字来控制。
就我个人而言,我真的不喜欢返回类型单独占一行,所以我将PenaltyReturnTypeOnItsOwnLine
设置为非常大的数字。
顺带一提,这个系统是从Latex继承下来的,它允许您指定各种用于换行、分页和断字等的惩罚。
dscho
)于2017年9月29日提交)。dscho
--合并于提交42efde4,2017年10月1日)
您可以在这里看到旧值和新值:
为了说明这些价值观:
clang-format
: 调整换行惩罚我们非常、非常、非常希望将每行的列限制在80个以下:Git邮件列表上为数不多的一致风格建议是,每行不应超过80列(即使79列更合理,因为代码经常被视为差异,并且比较会添加一个额外字符)。
然而,如Brandon Williams所指出的那样,超额字符的惩罚5太低,无法保证这一点。
(请参见此线程)
从现有的clang-format示例和文档中可以看出,100是被认为适用于Stuff You Really Don't Want
的惩罚分数,因此让我们将其分配为"excess characters"的惩罚分数,即过长的行。
在此同时,进一步调整惩罚分数:实际上我们并不太关心在注释或字符串文字内部防止换行,所以100分的惩罚分数似乎过高。
同样地,我们并不是非常坚持在赋值运算符之前保持换行(Git的很多代码都会在=
字符后立即断开,以保持80列/行的限制)。
我们对函数的返回类型单独占据一行的程度比0分的惩罚分数更加不满意,因此也进行了调整。
最后,我们并不特别喜欢在调用的第一个参数之前断开,但如果这使得行长度小于80列/行,那么我们就这样做,因此降低在调用的第一个参数之前断开的惩罚分数,但不要像在注释中引入新的换行符那样降低太多。