97 votes

Pourquoi les gens utilisent-ils si souvent le __ (double soulignement) en C++ ?

J'ai jeté un coup d'œil à un code C++ à code source ouvert et j'ai remarqué que de nombreux doubles tirets de soulignement étaient utilisés dans le code, principalement au début des noms de variables.

return __CYGWIN__;

Je me demandais juste : Y a-t-il une raison à cela, ou est-ce simplement le style de code de certaines personnes ? Je pense que cela rend le code difficile à lire.

2 votes

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

2 votes

Non, ce n'est pas un délimiteur. Les underscores sont utilisés pour distinguer les noms réservés à l'implémentation des noms que le code source des utilisateurs peut utiliser. Les utilisateurs peuvent faire #define FOO 1 mais ils ne doivent pas faire #define __FOO__ 1 et donc la mise en œuvre est libre d'utiliser le nom __FOO__ pour ses propres macros, variables, fonctions, etc.

0 votes

Je pense que Matthew voulait dire que c'est stylistiquement/visuellement un délimiteur, pas fonctionnellement. Ce qui est une hypothèse intéressante, mais incorrecte étant donné ce que j'ai lu précédemment et la réponse de Jonathan.

132voto

maccullt Points 1555

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

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

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

1 votes

Ce guide semble avoir été écrit avant namespace a été introduit.

0 votes

Il s'agit également d'une proposition de l'imperial college londonien et non de la norme C++ ; cela peut être une bonne suggestion.

1 votes

@cz Les espaces de noms ne sont pas pertinents. Un en-tête de système pourrait définir un nom de macro qui commence par un trait de soulignement, par ex. _main .

52voto

Charles Bailey Points 244082

Sauf s'ils estiment 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 précises, et sont légèrement plus détaillées que ce que d'autres ont suggéré.

Tous les identifiants qui contiennent un double soulignement ou qui commencent par un soulignement suivi d'une lettre majuscule sont réservés à l'usage de l'implémentation à toutes les échelles, c'est-à-dire qu'ils peuvent être utilisés pour des 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 à la mise en œuvre au niveau mondial. Cela signifie que vous pouvez utiliser ces identificateurs dans vos propres espaces de noms ou dans les définitions de classes.

C'est pourquoi Microsoft utilise des noms de fonction avec un trait de soulignement en tête et tout en minuscules pour un grand nombre de fonctions de sa bibliothèque d'exécution de base qui ne font pas partie de la norme C++. Ces noms de fonction ne risquent pas d'entrer en conflit avec les fonctions C++ standard ou les fonctions du code utilisateur.

1 votes

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

38voto

James Curran Points 55356

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.

20 votes

Plus que cela : les identifiants contenant un double soulignement à n'importe quel endroit sont réservés. 17.4.3.1.2

0 votes

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

11voto

bog Points 1160

Les commentaires qui précèdent sont exacts. __Symbol__ est généralement un jeton magique fourni par votre fournisseur de compilateur (ou de 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 voulez enregistrer une sorte d'échec d'assertion de programme, y compris l'emplacement textuel de l'erreur.

8voto

Menkboy Points 1259

C'est quelque chose que l'on n'est pas censé faire dans un code "normal". Cela permet aux compilateurs et aux bibliothèques système de définir des symboles qui n'entrent pas en collision avec les vôtres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X