Il est courant en C ++ de nommer les variables membres avec une sorte de préfixe pour indiquer le fait que ce sont des variables membres, plutôt que des variables ou des paramètres locaux. Si vous venez d'un arrière-plan MFC, vous utiliserez probablement m_foo
. J'en ai aussi vu myFoo
occasionnellement.
C # (ou peut-être juste .NET) semble recommander d'utiliser juste un trait de soulignement, comme dans _foo
. Est-ce autorisé par la norme C ++?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
la source
la source
Réponses:
Les règles (qui n'ont pas changé en C ++ 11):
std
espace de noms est réservé. (Vous êtes cependant autorisé à ajouter des spécialisations de modèle.)De la norme C ++ 2003:
Parce que C ++ est basé sur la norme C (1.1 / 2, C ++ 03) et C99 est une référence normative (1.2 / 1, C ++ 03), ils s'appliquent également, à partir de la norme C 1999:
D'autres restrictions peuvent s'appliquer. Par exemple, la norme POSIX réserve de nombreux identifiants susceptibles d'apparaître en code normal:
E
suivaient un chiffre ou une lettre majuscule:is
outo
suivis d'une lettre minusculeLC_
suivis d'une lettre majusculef
oul
réservésSIG
suivis d'une lettre majuscule sont réservésSIG_
suivis d'une lettre majuscule sont réservésstr
,mem
ouwcs
suivis d'une lettre minuscule sont réservésPRI
ouSCN
suivis d'une lettre minuscule ouX
sont réservés_t
sont réservésBien que l'utilisation de ces noms à vos propres fins en ce moment ne puisse pas poser de problème, ils soulèvent la possibilité d'un conflit avec les futures versions de cette norme.
Personnellement, je ne démarre tout simplement pas les identifiants avec des traits de soulignement. Nouvel ajout à ma règle: n'utilisez pas de soulignements doubles n'importe où, ce qui est facile car j'utilise rarement des traits de soulignement.
Après avoir fait des recherches sur cet article, je ne termine plus mes identifiants avec
_t
car cela est réservé par la norme POSIX.La règle concernant tout identifiant se terminant par
_t
m'a beaucoup surpris. Je pense que c'est un standard POSIX (pas encore sûr) à la recherche de clarifications et de chapitres et versets officiels. Ceci provient du manuel GNU libtool , listant les noms réservés.CesarB a fourni le lien suivant vers les symboles réservés POSIX 2004 et note "que de nombreux autres préfixes et suffixes réservés ... peuvent y être trouvés". Les symboles réservés POSIX 2008 sont définis ici. Les restrictions sont un peu plus nuancées que celles ci-dessus.
la source
_Bool
et_Imaginary
n'existe-t-il pas en C ++? Le langage C ++ est défini explicitement, pas en termes de "modifications" en C, sinon la norme pourrait être beaucoup plus courte!Les règles pour éviter la collision de noms sont à la fois dans la norme C ++ (voir le livre Stroustrup) et mentionnées par les gourous C ++ (Sutter, etc.).
Règle personnelle
Parce que je ne voulais pas traiter de cas et que je voulais une règle simple, j'ai conçu une règle personnelle à la fois simple et correcte:
Lorsque vous nommez un symbole, vous éviterez les collisions avec les bibliothèques de compilation / OS / standard si vous:
Bien sûr, placer votre code dans un espace de noms unique permet également d'éviter les collisions (mais ne protège pas contre les macros malveillantes)
Quelques exemples
(J'utilise des macros parce qu'elles sont les plus polluantes pour le code des symboles C / C ++, mais cela peut aller du nom de variable au nom de classe)
Extraits du brouillon C ++ 0x
Du fichier n3242.pdf (je m'attends à ce que le texte standard final soit similaire):
Mais aussi:
Cette dernière clause est déroutante, sauf si vous considérez qu'un nom commençant par un trait de soulignement et suivi d'une lettre minuscule serait OK s'il n'était pas défini dans l'espace de noms global ...
la source
__WRONG_AGAIN__
contient deux traits de soulignement consécutifs (deux au début et deux à la fin), donc c'est faux selon la norme.WRONG__WRONG
contient deux traits de soulignement consécutifs (deux au milieu), donc c'est faux selon la norme__attribute__
pour GCC).1234567L
ou4.0f
; IIRC ceci fait référence à ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Parce que la norme dit que ceux-ci sont réservés. Ce n'est pas un conseil sur le bon ou le mauvais style. C'est une décision de la norme. Pourquoi ont-ils décidé cela? Je suppose que les premiers compilateurs ont déjà utilisé de telles conventions de manière informelle avant la normalisation.Depuis MSDN :
Cela signifie que vous pouvez utiliser un seul trait de soulignement comme préfixe de variable membre, à condition qu'il soit suivi d'une lettre minuscule.
Cela est apparemment tiré de la section 17.4.3.1.2 de la norme C ++, mais je ne trouve pas de source originale pour la norme complète en ligne.
Voir aussi cette question .
la source
Quant à l'autre partie de la question, il est courant de mettre le soulignement à la fin du nom de la variable pour ne pas entrer en conflit avec quoi que ce soit interne.
Je le fais même à l'intérieur des classes et des espaces de noms car je n'ai alors qu'à me souvenir d'une règle (par rapport à "à la fin du nom dans la portée globale et au début du nom partout ailleurs").
la source
Oui, les traits de soulignement peuvent être utilisés n'importe où dans un identifiant. Je crois que les règles sont les suivantes: az, AZ, _ dans le premier caractère et celles + 0-9 pour les caractères suivants.
Les préfixes de soulignement sont courants dans le code C - un seul soulignement signifie "privé" et les doubles soulignements sont généralement réservés à l'usage du compilateur.
la source