Dans le format clang, que font les pénalités?

clang-format sytle options documentation comprend un certain nombre d'options appelées Punityxxx. La documentation n'explique pas comment ces pénalités devraient être utilisées. Pouvez-vous décrire comment utiliser ces valeurs de pénalité et quel effet elles produisent (peut-être avec un exemple)?

30
demandé sur Scott Langham 2014-10-29 19:10:45

2 réponses

lorsque vous avez une ligne qui dépasse la limite de longueur de ligne, clang-format devra insérer une ou plusieurs pauses quelque part. Vous pouvez penser à des pénalités comme un moyen de décourager certains comportements de rupture de ligne. Par exemple, disons que vous avez:

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

Clang-format va probablement formater pour paraître un peu étrange:

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

vous pourriez décider que vous êtes prêt à violer la longueur de la ligne par un ou deux personnages pour des cas comme celui-ci, de sorte que vous pouvez orienter qu'en fixant le PenaltyExcessCharacter pour un faible nombre et PenaltyBreakBeforeFirstCallParameter pour un nombre plus élevé.

personnellement, je n'aime pas vraiment quand le type de retour est sur sa propre ligne, donc je mets PenaltyReturnTypeOnItsOwnLine à un nombre absurdement grand.

mis de côté, ce système a été hérité de Latex, ce qui vous permet de spécifier toutes sortes de pénalités pour rupture de ligne, pagination, et hyphénation.

16
répondu JHumphrey 2014-12-22 18:18:29

pouvez-vous décrire comment utiliser ces valeurs de pénalité et quel effet elles produisent (peut-être avec un exemple)?

Vous pouvez voir un exemple dans cette Git 2.15 (T4 2017) clang-format le projet Git écrit en C:

Voir valider 42efde4 (29 septembre 2017) par Johannes Schindelin (dscho).

(fusionné par Johannes Schindelin -- dscho--valider 42efde4, 01 Oct 2017)

Vous pouvez voir les anciennes et les nouvelles valeurs ici:

clang

Pour illustrer ces valeurs:

clang-format: réglage de saut de ligne pénalités

nous voulons vraiment, vraiment, vraiment limiter les colonnes à 80 par ligne: un des quelques commentaires de style cohérent sur la liste de diffusion Git est que le les lignes ne doivent pas avoir plus de 80 colonnes/ligne (même si 79 colonnes/ligne serait plus logique, étant donné que le code est souvent considéré comme diff, et diffs ajoute un caractère supplémentaire).

La pénalité de 5 pour excès de caractères est trop faible pour garantir que, cependant, comme L'a souligné Brandon Williams.

( voir ce fil)

à partir des exemples existants de format clang et de la documentation, il apparaît que 100 est une sanction jugée appropriée pour Stuff You Really Don't Want, alors assignons que la pénalité pour "caractères en excès", i.e. trop de longues lignes.

pendant que vous y êtes, ajustez encore les pénalités: nous ne sommes pas vraiment enthousiastes sur la prévention de nouvelles ruptures de ligne dans les commentaires ou la chaîne de caractères pénalité de 100 semble terriblement élevé.

de la même façon, nous ne sommes pas si catégoriques que cela sur le fait de garder la ligne de rupture de la part des opérateurs d'affectation (beaucoup de codes de Git cassent immédiatement après = le caractère juste pour garder cette limite de 80 colonnes / ligne).

nous désapprouvons un peu plus sur les types de retour de fonctions leur propre ligne que la pénalité 0 suggérerait, donc cela a été ajusté, trop.

enfin, nous n'avons pas vraiment envie de casser avant le premier paramètre dans un appel, mais si elle garde la ligne plus courte que 80 colonnes/lignes, c'est ce que nous faisons, donc baisser la pénalité pour rupture avant le premier appel paramètre, mais pas tout à fait autant comme l'introduction de nouvelles pauses de ligne à commentaire.

1
répondu VonC 2017-10-14 22:26:42