web-dev-qa-db-fra.com

comment faire ajouter une nouvelle ligne au format clang avant d'ouvrir l'accolade d'une fonction?

Je suis intéressé à mettre une accolade ouvrante pour les fonctions (mais pas si les instructions et autres contextes). Par exemple

void foo()
{
   ...
}

Mis à part les guerres de flammes, y a-t-il une bonne justification pour pas faire cela? Bien que j'utilise des crochets ouverts de même ligne pour les blocs if/else et plus petits, je pense que dans ce cas, l'organisation visuelle d'unités de code plus grandes (fonctions/méthodes/classes/structures) peut l'emporter sur une cohérence parfaite.

De plus, comment puis-je obtenir le format clang pour suivre ce style?

18
daj

Comme le dit documentation , appelez clang-format avec -style=file, et utilisez un .clang-format fichier placé dans un répertoire englobant pour personnaliser les options de style. L'option de style de format spécifiant le placement de l'accolade s'appelle BreakBeforeBraces. Depuis les documents,

BreakBeforeBraces (BraceBreakingStyle)

Le style de rupture d'accolade à utiliser.

Valeurs possibles:

  • BS_Attach (dans la configuration: Attach) Attachez toujours les accolades au contexte environnant.
  • BS_Linux (dans la configuration: Linux) Comme Attach, mais s'arrête avant les accolades sur les définitions de fonction, d'espace de nom et de classe.
  • BS_Stroustrup (dans la configuration: Stroustrup) Comme Attach, mais casse avant les définitions de fonction et ‘else’.
  • BS_Allman (dans la configuration: Allman) Toujours rompre avant les accolades.
  • BS_GNU (dans la configuration: GNU) Séparez toujours avant les accolades et ajoutez un niveau supplémentaire d'indentation aux accolades des instructions de contrôle, pas à celles de la classe, de la fonction ou d'autres définitions.

Le style qui correspond à votre description est BS_Stroustrup. Ajoutez l'entrée suivante à votre .clang-format

BreakBeforeBraces: Stroustrup

En plus des documents, clangformat.com répertorie toutes les options et illustre bon nombre d'entre elles avec des exemples.

24
Pradhan

Pradhan a un excellente réponse , mais vous pouvez constater que vous obtenez des pauses là où vous ne les voulez pas (comme je l'ai trouvé).

Il existe une autre option, "Custom", dans au moins les versions au format clang 3.8 et 5 (j'utilise 3.8 et j'ai trouvé BS_Custom dans les 5 documents). Avec cela, vous pouvez spécifier dans BraceWrapping ce que vous voulez, y compris une option "AfterFunction".

Dans l'extrait d'exemple suivant, j'ai répertorié les autres comme vrai/faux car la question de l'OP spécifie uniquement AfterFunction (c'est-à-dire "avant d'ouvrir l'accolade d'une fonction"):

BraceWrapping:
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true/false
  AfterFunction:   true
  AfterNamespace:  true/false
  AfterObjCDeclaration: true/false
  AfterStruct:     true/false
  AfterUnion:      true/false
  BeforeCatch:     true/false
  BeforeElse:      true/false
  IndentBraces:    true/false
BreakBeforeBraces: Custom

J'ai testé cela avec ma configuration et cela donne un contrôle plus fin de la rupture de l'accolade.

12
sage