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

时间:2014-10-29 16:10:46

标签: c++ clang-format

clang-format sytle options documentation包含许多名为PenaltyXXX的选项。该文件没有解释应如何使用这些处罚。你能描述一下如何使用这些惩罚值及其实现的效果(可能还有一个例子)吗?

2 个答案:

答案 0 :(得分:21)

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

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(args);
// and the column limit is here:                                        ^

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

Namespaces::Are::Pervasive::SomeReallyVerySuperDuperLongFunctionName(
    args);

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

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

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

答案 1 :(得分:5)

  

你能描述一下如何使用这些惩罚值及其实现的效果(可能还有一个例子)吗?

你可以在这个用C编写的the Git project的Git 2。5(2017年第4季度)clang-format中看到一个例子:

commit 42efde4Johannes Schindelin (dscho)(2017年9月29日) Johannes Schindelin -- dscho --于2017年10月1日commit 42efde4合并)

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

clang

说明这些值:

  

clang-format:调整换行符

     

我们确实非常希望将每行限制为80行:一   Git邮件列表中一些风格一致的评论是   行不应超过80列/行(即使79列/行   考虑到代码经常被视为差异,会更有意义   和差异添加额外的字符)。

     

超额角色的罚分为5太低,无法保证,   但是,正如Brandon Williams所指出的那样。

See this thread

  

从现有的clang格式示例和文档中可以看出   100是被认为适合Stuff You Really Don't Want 的惩罚,所以我们将其指定为“多余字符”的惩罚,即   过长的路线。

     

在此期间,进一步调整处罚:我们实际上并不那么敏锐   关于防止注释或字符串文字中的新换行符,所以   罚款100似乎非常高。

     

同样,我们并不是那么坚持要保持换行符   来自赋值运算符(很多Git的代码在之后立即中断   =字符仅保留80列/行限制。

     

我们对函数的返回类型有所了解   他们自己的路线比罚款0暗示,所以这个被调整,   太

     

最后,我们并没有特别想要在第一个参数之前打破   在一个电话中,如果它保持线短于80列/线,那就是   我们做什么,所以降低在通话之前打破的罚款   参数,但不如引入新的换行符那么多   评价。