在clang格式中,惩罚是做什么的?

Sco*_*ham 40 c++ clang-format

铛格式sytle选项文件包括一些所谓的PenaltyXXX选项.该文件没有解释应如何使用这些处罚.你能描述一下如何使用这些惩罚值及其实现的效果(可能还有一个例子)?

小智 26

当你的行超过行长度限制时,clang-format将需要在某处插入一个或多个符号.您可以将惩罚视为阻止某些突破行为的一种方式.例如,假设你有:

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(args);
// and the column limit is here:                                        ^
Run Code Online (Sandbox Code Playgroud)

Clang格式可能会格式化看起来有点奇怪:

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(
    args);
Run Code Online (Sandbox Code Playgroud)

对于这样的情况,您可能会认为您愿意用一两个字符来违反行长,因此您可以通过将其设置PenaltyExcessCharacter为较低的数字和PenaltyBreakBeforeFirstCallParameter更高的数字来引导它.

就个人而言,我真的不喜欢返回类型在它自己的行上,所以我设置PenaltyReturnTypeOnItsOwnLine了一个荒谬的大数字.

另外,这个系统继承自Latex,它允许您指定断行,分页和连字的各种惩罚.

  • @void.pointer:数值不能在绝对范围内解释,它们仅具有相对含义。此外,它们不是在单个上下文中使用,而是根据正在格式化的源代码逐步添加。我一直在阅读源代码,里面散布着硬编码的魔法惩罚,范围从 1 到至少 5000…… (2认同)

Von*_*onC 7

您能否描述如何使用这些惩罚值以及它们实现了什么效果(也许举一个例子)?

你可以在这个混帐2.15(2017年第4季度)看一个例子clang-formatGit项目用C写的:

参见Johannes Schindelin()的commit 42efde4(2017年9月29日(由Johannes Schindelin合并--commit 42efde4中,2017年10月1日)dscho
dscho

您可以在此处查看旧值和新值:

铛

为了说明这些值:

clang-format:调整换行罚分

我们确实非常希望将每列的行数限制为80:Git邮件列表上的一些一致的样式注释之一是,每行的行数不应超过80列(即使每行79列更加合理,因为该代码通常被视为diff,并且diff添加了额外的字符)。

但是,正如布兰登·威廉姆斯(Brandon Williams)所指出的那样,多余字符的罚款5太低,无法保证这一点。

请参阅此线程

从现有的clang格式示例和文档中,看来100是适合的惩罚Stuff You Really Don't Want,因此让我们将其分配为“多余字符”的惩罚,即,超长行。

同时,进一步调整惩罚:实际上,我们并不是很想防止注释或字符串文字中出现新的换行符,因此100的惩罚似乎太高了。

同样,对于让换行符与赋值运算符保持距离,我们并不是那么坚定(很多Git的代码在=字符之后立即中断,只是为了保持80列/行的限制)。

我们确实对函数的返回类型不满意,而不是惩罚为0所建议的,因此对此有些皱眉,因此也对此进行了调整。

最后,我们并不是特别喜欢在调用中的第一个参数之前断开,但如果这样做使行短于80列/行,那就是我们要做的事情,因此降低在调用第一个参数之前断开的代价,但不就像在注释中引入新的换行符一样。