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.
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.