2008-10-22 3 views
78

Je jetais un coup d'oeil à du code C++ open source et notais beaucoup de doubles sous-scores utilisés dans le code, principalement au début des noms de variables.Pourquoi les gens utilisent-ils tellement __ (double trait de soulignement) en C++

return __CYGWIN__; 

Je me demandais est-il une raison pour cela, ou est-ce que quelques personnes styles de code? Je pense que je le rend difficile à lire.

+1

Pourquoi difficile à lire? Il est conçu principalement comme un délimiteur, tout comme les citations.Si je me souviens, il est principalement utilisé pour les constantes intégrées. –

Répondre

107

De Programming in C++, Rules and Recommendations:

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 des fonctions de la bibliothèque (telles que «_main» et «_exit»). Afin d'éviter les collisions, ne commencez pas un identifiant avec un trait de soulignement.

+0

Ce guide semble avoir été écrit avant l'introduction de 'namespace'. –

8

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 ne vont pas entrer en collision avec les vôtres.

32

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

+14

Plus que cela: les identifiants * contenant un trait de soulignement double n'importe où en eux * sont réservés. 17.4.3.1.2 –

+0

En C++, je ne vois que [lex.name] et pour les noms globaux [global.names]. Pouvez-vous donner des références? merci –

9

Les commentaires précédents sont corrects. __Symbol__ est généralement un jeton magique fourni par votre fournisseur de compilateur (ou préprocesseur). Peut-être que les plus 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 voulez enregistrer une sorte d'échec d'assertion de programme, y compris l'emplacement textuel de l'erreur.

1

En plus des bibliothèques auxquelles beaucoup d'autres personnes ont répondu, Certaines personnes nomment également des macros ou des valeurs #define à utiliser avec le préprocesseur. Cela faciliterait le travail et pourrait permettre de contourner les bogues des anciens compilateurs.

Comme d'autres mentionné, il aide à prévenir les collisions de noms et aide à délimiter entre les variables de la bibliothèque et les vôtres.

46

A moins qu'ils ne sentent qu'ils font "partie de la mise en œuvre", c'est-à-dire les bibliothèques standard, alors ils ne devraient pas le faire.

Les règles sont assez spécifiques et légèrement plus détaillées que d'autres ne l'ont suggéré. Tous les identificateurs qui contiennent un trait de soulignement double ou un début avec un trait de soulignement suivi d'une lettre majuscule sont réservés pour l'utilisation de l'implémentation à toutes les étendues, c'est-à-dire qu'ils peuvent être utilisés pour les macros. En outre, tous les autres identifiants qui commencent par un trait de soulignement (c'est-à-dire qui ne sont pas suivis d'un autre trait de soulignement ou d'une lettre majuscule) sont réservés pour l'implémentation à l'échelle globale. 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 fonctions avec un trait de soulignement principal et tout en minuscules pour plusieurs de leurs fonctions de bibliothèque d'exécution principales qui ne font pas partie de la norme C++. Ces noms de fonctions sont garantis de ne pas entrer en conflit avec les fonctions C++ standard ou les fonctions de code utilisateur.

+1

En C++, je ne vois que [lex.name] et pour les noms globaux [global.names]. Pouvez-vous donner des références? Merci –

Questions connexes