c++ - créer - nouvelle couleur tag mac




Quelles sont les règles d'utilisation d'un trait de soulignement dans un identifiant C++? (4)

Comme pour l'autre partie de la question, il est courant de mettre le trait de soulignement à la fin du nom de la variable pour ne pas entrer en conflit avec quelque chose d'interne.

Je le fais même à l'intérieur des classes et des espaces de noms parce que je dois seulement me souvenir d'une règle (par rapport à "à la fin du nom dans la portée globale, et le début du nom partout ailleurs").

Il est courant en C ++ de nommer les variables membres avec un type de préfixe pour indiquer le fait qu'il s'agit de variables membres plutôt que de variables ou de paramètres locaux. Si vous venez d'un arrière-plan MFC, vous utiliserez probablement m_foo . J'ai aussi vu myFoo temps en temps.

C # (ou peut-être juste. NET) semble recommander d'utiliser juste un trait de soulignement, comme dans _foo . Est-ce autorisé par le standard C ++?


De MSDN :

L'utilisation de deux caractères de soulignement séquentiels (__) au début d'un identificateur ou d'un trait de soulignement unique suivi d'une lettre majuscule est réservé aux implémentations C ++ dans toutes les étendues. Vous devez éviter d'utiliser un caractère de soulignement avant suivi d'une lettre minuscule pour les noms avec l'étendue de fichier en raison de conflits possibles avec les identifiants réservés actuels ou futurs.

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.

Ceci est apparemment tiré de la section 17.4.3.1.2 de la norme C ++, mais je ne trouve pas de source originale pour le standard complet en ligne.

Voir aussi cette question .


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 les 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 du compilateur / système d'exploitation / standard si vous:

  • ne commence jamais un symbole avec un trait de soulignement
  • Ne nommez jamais un symbole avec deux traits de soulignement consécutifs à l'intérieur.

Bien sûr, mettre votre code dans un espace de noms unique permet également d'éviter les collisions (mais ne protège pas contre les macros malfaisantes)

Quelques exemples

(J'utilise des macros parce qu'elles sont les plus polluantes des symboles C / C ++, mais cela peut être n'importe quoi, du nom de la variable au nom de la classe)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

Extraits du projet C ++ 0x

A partir du fichier n3242.pdf (je m'attends à ce que le texte standard final soit similaire):

17.6.3.3.2 Noms globaux [global.names]

Certains ensembles de noms et de signatures de fonctions sont toujours réservés à l'implémentation:

- Chaque nom qui contient un double trait de soulignement _ _ ou qui commence par un trait de soulignement suivi d'une lettre majuscule (2.12) est réservé à l'implémentation pour toute utilisation.

- Chaque nom commençant par un trait de soulignement est réservé à l'implémentation pour être utilisé comme nom dans l'espace de noms global.

Mais aussi:

17.6.3.3.5 Suffixes littéraux définis par l'utilisateur [usrlit.suffix]

Les identificateurs de suffixe littéraux qui ne commencent pas par un trait de soulignement sont réservés pour une normalisation future.

Cette dernière clause prête à confusion, 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'est pas défini dans l'espace de noms global ...


Oui, les traits de soulignement peuvent être utilisés n'importe où dans un identifiant. Je crois que les règles sont: any de az, AZ, _ dans le premier caractère et ceux + 0-9 pour les caractères suivants.

Les préfixes d'underscore sont communs dans le code C - un seul trait de soulignement signifie "private", et les doubles caractères de soulignement sont généralement réservés à l'usage du compilateur.





c++-faq