J'étais en train de parcourir du code C ++ open source et j'ai remarqué beaucoup de doubles sous-scores utilisés dans le code, principalement au début des noms de variables.
return __CYGWIN__;
Vous vous demandez simplement s'il y a une raison à cela, ou est-ce juste des gens qui codent des styles? Je pense que cela rend la lecture difficile.
c++
double-underscore
Nathan W
la source
la source
#define FOO 1
mais ils ne doivent pas le faire#define __FOO__ 1
et par conséquent, l'implémentation est libre d'utiliser le nom__FOO__
pour ses propres macros, variables, fonctions, etc.Réponses:
De la programmation en C ++, règles et recommandations :
la source
namespace
être présenté._main
.À moins qu'ils ne sentent qu'ils font «partie de l'implémentation», c'est-à-dire des bibliothèques standard, ils ne devraient pas le faire.
Les règles sont assez spécifiques et sont un peu plus détaillées que certains autres l'ont suggéré.
Tous les identifiants contenant un double trait de soulignement ou commençant par un trait de soulignement suivi d'une lettre majuscule sont réservés à l'utilisation de l'implémentation dans toutes les portées, c'est-à-dire qu'ils peuvent être utilisés pour des macros.
De plus, tous les autres identifiants qui commencent par un trait de soulignement (c'est-à-dire non suivi d'un autre trait de soulignement ou d'une lettre majuscule) sont réservés pour l'implémentation au niveau global. Cela signifie que vous pouvez utiliser ces identificateurs dans vos propres espaces de noms ou dans des définitions de classe.
C'est pourquoi Microsoft utilise des noms de fonctions avec un trait de soulignement en tête et le tout 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 de ne pas entrer en conflit avec les fonctions C ++ standard ou les fonctions de code utilisateur.
la source
Selon la norme C ++, les identificateurs 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.
la source
Les commentaires précédents sont corrects.
__Symbol__
est généralement un jeton magique fourni par votre fournisseur de compilateur (ou préprocesseur) utile. Les plus utilisés sont peut-être__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.la source
C'est quelque chose que vous n'êtes pas censé faire dans un code «normal». Cela garantit que les compilateurs et les bibliothèques système peuvent définir des symboles qui n'entreront pas en conflit avec les vôtres.
la source
Les doubles traits de soulignement sont réservés à l'implémentation
La réponse la plus votée cite la programmation en C ++: règles et recommandations :
Cependant, après avoir lu quelques C ++ et les normes C, je ne pouvais trouver aucune mention de underscores étant limité à seulement une utilisation interne du compilateur. Les normes sont plus générales, réservant un double soulignement pour la mise en œuvre .
C ++
C ++ (version de travail actuelle, consulté le 2019-5-26) indique
lex.name
:C
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
C17 dit la même chose que C99.
Quelle est la mise en œuvre ?
Pour C / C ++, l' implémentation fait généralement référence aux ressources d'ensemble nécessaires pour produire un exécutable à partir de fichiers source utilisateur. Ceci comprend:
Exemples d'implémentations
Il existe un certain nombre d'implémentations C ++ différentes mentionnées sur Wikipedia . (pas de lien d'ancrage, ctrl + f "implémentation")
Voici un exemple d'implémentation C / C ++ de Digital Mars réservant certains mots-clés à une de leurs fonctionnalités.
la source
En plus des bibliothèques sur lesquelles 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 aurait permis de contourner des bogues dans les anciens compilateurs.
Comme d'autres l'ont mentionné, il permet d'éviter la collision de noms et de délimiter entre les variables de bibliothèque et les vôtres.
la source