在clang格式中,惩罚有啥作用?

Posted

技术标签:

【中文标题】在clang格式中,惩罚有啥作用?【英文标题】:In clang-format, what do the penalties do?在clang格式中,惩罚有什么作用? 【发布时间】:2014-12-25 10:53:15 【问题描述】:

clang-format sytle options documentation 包含许多称为 PenaltyXXX 的选项。文档没有解释应该如何使用这些惩罚。你能描述一下如何使用这些惩罚值以及它们达到什么效果(也许用一个例子)?

【问题讨论】:

Daniel Jasper 有一个视频。在大约 10:40 左右,他简要解释了处罚。这似乎是决定“最佳”格式的因素。 【参考方案1】:

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

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

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

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

在这种情况下,您可能决定愿意将行长超出一两个字符,因此您可以通过将PenaltyExcessCharacter 设置为较低的数字并将PenaltyBreakBeforeFirstCallParameter 设置为较高的数字来控制这一点。

就我个人而言,我真的不喜欢返回类型单独一行,所以我将PenaltyReturnTypeOnItsOwnLine 设置为一个大得离谱的数字。

顺便说一句,这个系统是从 Latex 继承而来的,它允许你为换行、分页和断字指定各种惩罚。

【讨论】:

那么较低的惩罚意味着它会被优先选择?惩罚值实际上映射到什么?我怎么知道 3 会被 5 取代? 3 和 5 是什么意思? @void.pointer:数值不能在绝对范围内解释,它们只有相对意义。此外,它们不是在单个上下文中使用,而是根据正在格式化的源代码逐渐增加。我一直在阅读源代码,到处都是硬编码的魔法惩罚,从 1 到至少 5000... @Cameron 我仍然不确定如何他们工作。就我而言,我只是毫无目的地看到数字。此时我不知道将哪些数字分配给哪些选项。这个系统不是很可预测。 惩罚似乎会影响换行算法,该算法会尝试选择最佳路径(其中最佳路径是将换行符放在一行中以使总惩罚最小化的路径) .不过,到处都有很多很多特殊情况。许多选项相互作用,有时是模糊的。肯定有很多极端情况会产生奇怪的结果。【参考方案2】:

你能描述一下如何使用这些惩罚值以及它们达到什么效果(也许有一个例子)?

您可以在此 Git 2.15(2017 年第四季度)clang-format 中看到一个示例,用于用 C 语言编写的 the Git project:

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

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

为了说明这些价值观:

clang-format:调整换行惩罚

我们真的、真的、真的想将每行的列数限制为 80:一 Git 邮件列表中为数不多的风格一致的 cmets 是 行不应超过 80 列/行(即使 79 列/行 考虑到代码经常被视为差异,会更有意义, 和差异添加一个额外的字符)。

5 对多余字符的惩罚太低了,无法保证, 不过,正如 Brandon Williams 所指出的那样。

(See this thread)

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

同时,进一步调整惩罚:我们实际上并不那么热衷 关于防止 cmets 或字符串文字中的换行符,所以 100 的惩罚似乎非常高。

同样,我们也不是那么坚决地保持断线 来自赋值运算符(很多 Git 的代码在 = 字符只是为了保持 80 列/行的限制)。

我们确实对函数的返回类型有点皱眉 他们自己的线路比罚分 0 所暗示的要高,所以这被调整了, 也是。

最后,我们并不特别看中第一个参数之前的break 在通话中,但如果它使行短于 80 列/行,那就是 我们做什么,所以降低在第一次呼叫之前中断的惩罚 参数,但不如引入新的换行符 厘米。

【讨论】:

以上是关于在clang格式中,惩罚有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

clang++ 的选项 -fno-strict-enums 有啥作用?

格式字符串中的多个前导“#”符号有啥作用吗?

Qt Creater中Clang-format的使用

在 CLion 中使用 clang 格式

如何在每个工作区中配置没有 .clang-format 文件的 clang 格式?

有啥作用?意思是“格式(列表<?扩展 NameValuePair>”