web-dev-qa-db-fra.com

Existe-t-il une convention de capitalisation commune en C ++?

Je fais beaucoup de travail en Python et Java, et ces deux langages ont des conventions assez communes (mais pas universelles) sur la façon dont la capitalisation doit être utilisée dans les identificateurs: les deux utilisent PascalCase pour les noms de classe et ALL_CAPS pour les constantes "globales", mais pour d'autres identifiants, beaucoup de Java utilise mixedCase tandis que beaucoup de Python utilise underscore_delimiters. Je sais qu'aucun langage ou bibliothèque applique une majuscule particulière, mais j'ai trouvé que lorsque je m'en tiens aux conventions standard pour la langue que j'utilise, mon code semble beaucoup plus lisible.

Maintenant, je démarre un projet en C++, et j'aimerais appliquer la même idée. Y a-t-il une convention de capitalisation la plus courante que je devrais connaître?

13
David Z

Y a-t-il une convention de capitalisation la plus courante que je devrais connaître?

C++ est basé sur C, qui est assez vieux pour avoir développé tout un tas de conventions de dénomination au moment où C++ a été inventé. Ensuite, C++ en a ajouté quelques-uns, et C n'a pas hésité à en penser de nouveaux non plus. Ajoutez à cela les nombreux langages dérivés du C, qui ont développé les conventions de nommage C de leur inventeur, au point où ils se sont fertilisés en retour sur C et C++ ... En d'autres termes: C++ n'en a pas, mais plusieurs de ces conventions.

Cependant, si vous recherchez la convention de dénomination unique , vous pourriez aussi bien regarder la ( convention de dénomination de la bibliothèque standard , car c'est la seule que tous les développeurs C++ devront connaître et être habitués.

Cependant, quelle que soit la règle la plus importante que vous utilisez: Soyez cohérent!

Fait intéressant, alors que j'ai commencé avec un mélange de PascalCase et camelCase, et que j'ai été impliqué dans de nombreux projets avec des conventions de nommage encore plus nombreuses, au fil des années, je me suis retrouvé de plus en plus coincé avec la convention_library_convention. Ne me demandez pas pourquoi.

27
sbi

Soyons d'abord d'accord que ALL UPPERCASE est une horreur et doit être minimisé.

En C et C++, il est donc utilisé comme convention pour les macros, et les macros uniquement, car les macros sont tout aussi laides, pour ne pas dire mal.

Les premiers C n'avaient pas const, donc les constantes devaient être exprimées sous forme de macros. De plus, à ces débuts, les programmes étaient beaucoup plus courts, de sorte que les pratiques qui étaient mauvaises aujourd'hui pouvaient être utilisées (par exemple, l'IIRC Brian Kernighan a écrit du code avec beaucoup de macros non majuscules). Et aussi, à cette époque, les claviers qui n'avaient pas de lettres minuscules existaient; J'en ai utilisé un, sur l'ordinateur norvégien Tandberg EC-10, vers 1980 ou 1979, je crois.

Donc, Java a repris la convention en majuscules pour les constantes du début C. Pendant ce temps, et peut-être même avant (je ne suis pas sûr de la chronologie ici), C a obtenu des constantes. Cependant, alors que de Bien sûr, certains/plusieurs programmeurs C étaient coincés dans la convention précédente par nécessité de constantes comme macros majuscules, les programmeurs C++ étaient plus sensés.

De nos jours, le gros problème est lorsque les gens apprennent Java d'abord, ou C (avec les conventions du moyen âge) d'abord, puis viennent en C++, emportant avec eux cette fausse convention majuscule.

Donc,

    int const answer = 42;    // Nice, good, OK.
    const int ANSWER = 0x2A;  // Ouch!
    #define COMPANYNAME_ANSWER 052  // Oh kill me, please.

Eh bien, vous auriez pu penser que j'ai mentionné des claviers en majuscules uniquement pour plaisanter. Oh non. Parce qu'il s'agit simplement de la limitation technologique la plus ancienne et la plus archaïque qui a conduit aux conventions de dénomination, ou du moins affecté à quel point elles semblent fausses/correctes. Ensuite, il y a eu le problème de la transmission série 7 bits, qui a provoqué des problèmes correspondants avec les codes de caractères (encodages de caractères de newspeak) utilisés, ce qui signifiait que vous deviez vous limiter aux lettres de l'alphabet anglais, de A à Z.

En fait, je recommande de continuer à le faire. Voilà où nous en sommes! Nous ne sommes pas allés plus loin.

À l'heure actuelle, à partir de 2011, le C++ standard prend en charge Unicode général dans les noms (et ce depuis 1998), contrairement aux implémentations C++ réelles. En particulier, le compilateur g ++ a un caractère national contesté. Elle découle de cette limitation technologique des âges sombres.

Donc,

    double blueberryJamViscosity  = 0.0;    // OK
    double blåbærsyltetøyViskositet = 0.0;  // Ouch!

Enfin, au sujet des soulignés par rapport aux lettres majuscules entrecoupées,

  • Réservez un formulaire facilement reconnaissable pour les noms de type.
  • Réservez TOUS LES MAJUSCULES pour les macros.
  • Être cohérent.

Je pense que c'est vraiment, sauf pour les règles comme "éviter généralement le nom à une seule lettre sauf pour (boucle, paramètre de modèle, bla bla)" et "éviter d'utiliser l, facilement confondu avec 1" et "éviter les O majuscules, facilement confondu avec 0 ". Évitez également d'utiliser des noms réservés, comme commencer par un trait de soulignement suivi de majuscules, contenant deux traits de soulignement successifs, ou commencer par un trait de soulignement et être dans l'espace de noms global.

Santé et hth

19
Alf P. Steinbach

J'ai généralement tendance à m'en tenir à la convention que je vois le plus dans les bases de code existantes pour la langue. Dans le cas de C++, je vois généralement camelCase. Dans le cas de Ruby ou PHP je vois habituellement stuff_like_this.

De manière réaliste, cependant, la chose la plus importante est que vous choisissez une convention de style qui n'est pas totalement folle (dOnT_dO_tHiS) et que vous soyez cohérent avec elle. Faites en sorte que le style ne change pas dans le code d'un projet particulier. Si vous travaillez sur un projet existant, vous voudrez choisir le style qui existe déjà.

2
DeM0nFiRe

Eh bien, il y a Systems Hungarian qui est vraiment courant même maintenant, mais je préfère me couper la gorge que de le recommander. Le hongrois des applications est meilleur car ses marques annotatives sont vraiment indicatives de la sémantique, bien que je pense que c'est un peu trop vif des abréviations quand un mot court ferait l'affaire. (Pour utiliser l'exemple de cette page Wikipédia, pourquoi utiliser rw pour la ligne alors que row n'a qu'un caractère de plus? Ce n'est pas comme s'il y avait une pénurie mondiale de voyelles.)

En réalité, la chose la plus importante est de suivre les conventions de les personnes avec lesquelles vous travaillez . Vraiment. La plupart des conventions fonctionnent assez bien, surtout si elles sont utilisées de manière cohérente. L'incohérence est pire (encore plus que les systèmes hongrois, que je déteste). Et si vous êtes seul, utilisez ce que vous voulez.

1
Donal Fellows

D'après ce que j'ai vu, cela varie selon les projets.

Les traits de soulignement intégrés sont probablement plus traditionnels/plus couramment utilisés en C sous Unix. La bibliothèque standard suit également cela, donc elle devrait presque certainement être traitée comme la valeur par défaut, à utiliser à moins qu'il y ait suffisamment de code existant utilisant une autre convention pour forcer absolument à utiliser cette autre convention.

Windows (pour un exemple) utilise le cas de chameau pour la plupart de ses fonctions, donc pas mal de gens qui développent pour Windows font de même. Ceci est également assez fréquent chez les personnes qui sont vraiment plus habituées aux autres langages et tentent de traiter le C++ comme s'il ne s'agissait que d'une variante étrange d'autre chose.

1
Jerry Coffin

J'ai utilisé à la fois la bibliothèque standard et le boost comme référence pour les conventions de nommage. Cependant, il y a un problème avec cette solution.

La bibliothèque standard utilise une convention de dénomination conçue pour tenter de réduire les collisions avec votre code. Une partie de la solution consiste à utiliser toutes les lettres minuscules. D'où l'utilisation de soulignements au lieu de camelCase.

Je trouve que camelCase est lisible. PascalCase est souvent utilisé pour les noms de classe car il représente l'équivalent d'un nom propre. Cependant, je briserai cette règle pour les foncteurs qui sont plus représentatifs d'un verbe.

J'essaie de ne pas utiliser de macros. Cependant, quand je le fais, les macros sont conçues pour ressembler à des fonctions quand elles le peuvent. J'utilise également des valeurs const ou des énumérations au lieu de constantes manifestes, en évitant davantage les majuscules. Je préfixe généralement ces symboles avec un "k" pour indiquer qu'ils sont constants.

// instead of a manifest constant
#define HOURS 24

// use const
const int kHours = 24; 

// or enum
enum {
    kHours   = 24,
    kMinutes = 60
};
1
Bill Door

Cette référence décrit une convention de dénomination qui est assez similaire à celles que j'ai vues utilisées avec succès dans au moins trois entreprises pour lesquelles j'ai travaillé dans le passé.

Contrairement à une réponse antérieure, j'éviterais d'éviter de suivre la convention de dénomination de la bibliothèque standard C++ dans mon propre code, ne serait-ce que pour éviter les collisions de noms avec la bibliothèque standard.

Cette précédente réponse SO sur un sujet connexe peut également être intéressante: https: //stackoverflow.com/questions/228783/what-are-the-rules-about-using -un-underscore-in-ac-identifier

0
Gnawme