web-dev-qa-db-fra.com

Pourquoi les gens utilisent-ils tellement __ (double soulignement) en C ++

J'étais en train de jeter un coup d'œil à travers du code C++ open source et j'ai remarqué beaucoup de doubles sous-scores lorsqu'ils étaient utilisés dans le code, principalement au début des noms de variables.

return __CYGWIN__;

Je me demande simplement s'il y a une raison à cela, ou s'agit-il simplement de styles de code pour certaines personnes? Je pense que j'ai du mal à lire.

85
Nathan W

De Programmation en C++, règles et recommandations :

L'utilisation de deux traits de soulignement ("__") dans les identificateurs est réservée à l'usage interne du compilateur selon la norme ANSI-C.

Les traits de soulignement (`_ ') sont souvent utilisés dans les noms de fonctions de bibliothèque (tels que" _main "et" _exit "). Afin d'éviter les collisions, ne commencez pas un identifiant par un trait de soulignement.

119
maccullt

À moins qu'ils ne sentent qu'ils font "partie de l'implémentation", c'est-à-dire les bibliothèques standard, alors ils ne devraient pas.

Les règles sont assez spécifiques et sont un peu plus détaillées que d'autres l'ont suggéré.

Tous les identifiants qui contiennent un double trait de soulignement ou commencent par un trait de soulignement suivi d'une lettre majuscule sont réservés à l'utilisation de l'implémentation à toutes les étendues, c'est-à-dire qu'ils peuvent être utilisés pour les macros.

De plus, tous les autres identifiants qui commencent par un trait de soulignement (c'est-à-dire non suivis d'un autre trait de soulignement ou d'une lettre majuscule) sont réservés à l'implémentation au niveau global. Cela signifie que vous pouvez utiliser ces identifiants dans vos propres espaces de noms ou dans les définitions de classe.

C'est pourquoi Microsoft utilise des noms de fonction avec un trait de soulignement en tête et tous en minuscules pour bon nombre de leurs fonctions de bibliothèque d'exécution principales qui ne font pas partie de la norme C++. Ces noms de fonction sont garantis pour ne pas entrer en conflit avec les fonctions C++ standard ou les fonctions de code utilisateur.

48
CB Bailey

Selon la norme C++, les identifiants commençant par un trait de soulignement sont réservés aux bibliothèques. Les identificateurs commençant par deux traits de soulignement sont réservés aux fournisseurs de compilateurs.

34
James Curran

Les commentaires qui précèdent sont corrects. __Symbol__ est généralement un jeton magique fourni par votre fournisseur de compilateur (ou de préprocesseur) utile. Peut-être les plus largement utilisés sont __FILE__ et __LINE__, qui sont développés par le préprocesseur C pour indiquer le nom de fichier et le numéro de ligne actuels. C'est pratique lorsque vous souhaitez enregistrer une sorte d'échec d'assertion de programme, y compris l'emplacement textuel de l'erreur.

10
bog

C'est quelque chose que vous n'êtes pas censé faire en code "normal". Cela garantit que les compilateurs et les bibliothèques système peuvent définir des symboles qui n'entreront pas en collision avec les vôtres.

8
Menkboy

En plus des bibliothèques au sujet desquelles de nombreuses autres personnes ont répondu, certaines personnes nomment également des macros ou des valeurs #define à utiliser avec le préprocesseur. Cela faciliterait le travail avec, et aurait peut-être permis de contourner les bogues des anciens compilateurs.

Comme d'autres l'ont mentionné, cela aide à prévenir la collision de noms et à délimiter les variables de bibliothèque avec les vôtres.

2
Sqeaky

La réponse la plus votée cite Programmation en C++: règles et recommandations :

"L'utilisation de deux traits de soulignement (" __ ") dans les identificateurs est réservée à l'usage interne du compilateur conformément à la norme ANSI-C."

Cependant, la revendication de cette page semble être non fondée

J'ai recherché quelques normes C++ et C, et je n'ai trouvé aucune mention de soulignements limités à l'utilisation interne du compilateur.

C++ (version de travail actuelle, consulté le 2019-5-26) indique dans Lex.name:

  • Chaque identifiant qui contient un double trait de soulignement __ ou commence par un trait de soulignement suivi d'une lettre majuscule est réservé à l'implémentation pour toute utilisation.
  • Chaque identifiant qui commence par un trait de soulignement est réservé à l'implémentation pour être utilisé comme nom dans l'espace de noms global.

TL; DR: les doubles soulignements sont réservés à l'implémentation

Bien que cette question soit spécifique au C++, j'ai cité des sections pertinentes des normes C 99 et 17:

C99 section 7.1.3

  • Tous les identifiants qui commencent par un trait de soulignement et soit une lettre majuscule ou un autre trait de soulignement sont toujours réservés à toute utilisation.
  • Tous les identificateurs qui commencent par un trait de soulignement sont toujours réservés pour être utilisés comme identificateurs avec une portée de fichier dans les espaces de nom ordinaires et de balise.

C17 dit la même chose que C99.

2
RemarkableBucket