Les règles (qui n'ont pas changé en C ++ 11):
- Réservé dans n'importe quelle portée, y compris pour une utilisation en tant que macros d' implémentation :
- identificateurs commençant par un trait de soulignement suivi immédiatement d'une lettre majuscule
- identifiants contenant des traits de soulignement adjacents (ou "double trait de soulignement")
- Réservé dans l'espace de noms global:
- identificateurs commençant par un trait de soulignement
- De plus, tout dans l'
std
espace de noms est réservé. (Vous êtes cependant autorisé à ajouter des spécialisations de modèle.)
De la norme C ++ 2003:
17.4.3.1.2 Noms globaux [lib.global.names]
Certains ensembles de noms et de signatures de fonctions sont toujours réservés à l'implémentation:
- Chaque nom qui contient un double trait de soulignement (
__
) ou commence par un trait de soulignement suivi d'une lettre majuscule (2.11) est réservé à l'implémentation pour toute utilisation.
- Chaque nom qui commence par un trait de soulignement est réservé à l'implémentation pour être utilisé comme nom dans l'espace de noms global. 165
165) Ces noms sont également réservés dans l'espace de noms ::std
(17.4.3.1).
Parce que C ++ est basé sur la norme C (1.1 / 2, C ++ 03) et C99 est une référence normative (1.2 / 1, C ++ 03), ils s'appliquent également, à partir de la norme C 1999:
7.1.3 Identifiants réservés
Chaque en-tête déclare ou définit tous les identifiants répertoriés dans son sous-paragraphe associé, et déclare ou définit facultativement les identifiants répertoriés dans le sous-paragraphe et les identifiants des directions de bibliothèque qui lui sont associés, qui sont toujours réservés pour toute utilisation ou pour être utilisés comme identificateurs de portée de fichier.
- 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 identifiants qui commencent par un trait de soulignement sont toujours réservés pour être utilisés comme identifiants avec une portée de fichier dans les espaces de nom ordinaire et de balise.
- Chaque nom de macro dans l'un des sous-paragraphes suivants (y compris les futures directions de bibliothèque) est réservé pour une utilisation telle que spécifiée si l'un de ses en-têtes associés est inclus; sauf indication contraire explicite (voir 7.1.4).
- Tous les identifiants avec liaison externe dans l'un des sous-paragraphes suivants (y compris les futures instructions de bibliothèque) sont toujours réservés pour être utilisés comme identifiants avec liaison externe. 154
- Chaque identifiant avec portée de fichier répertorié dans l'un des sous-paragraphes suivants (y compris les futures instructions de bibliothèque) est réservé pour être utilisé comme nom de macro et comme identifiant avec portée de fichier dans le même espace de nom si l'un de ses en-têtes associés est inclus.
Aucun autre identifiant n'est réservé. Si le programme déclare ou définit un identifiant dans un contexte dans lequel il est réservé (autre que celui autorisé par 7.1.4), ou définit un identifiant réservé comme nom de macro, le comportement n'est pas défini.
Si le programme supprime (avec #undef
) toute définition de macro d'un identifiant dans le premier groupe répertorié ci-dessus, le comportement n'est pas défini.
154) La liste des identificateurs réservés avec une liaison externe comprend errno
, math_errhandling
, setjmp
et va_end
.
D'autres restrictions peuvent s'appliquer. Par exemple, la norme POSIX réserve de nombreux identifiants susceptibles d'apparaître en code normal:
- Les noms commençant par une majuscule
E
suivaient un chiffre ou une lettre majuscule:
- peut être utilisé pour des noms de code d'erreur supplémentaires.
- Noms commençant par
is
ou to
suivis d'une lettre minuscule
- peut être utilisé pour des fonctions de test et de conversion de caractères supplémentaires.
- Noms commençant par
LC_
suivis d'une lettre majuscule
- peut être utilisé pour des macros supplémentaires spécifiant des attributs de paramètres régionaux.
- Noms de toutes les fonctions mathématiques existantes suffixés
f
ou l
réservés
- pour les fonctions correspondantes qui opèrent respectivement sur les arguments float et long double.
- Les noms qui commencent par
SIG
suivis d'une lettre majuscule sont réservés
- pour des noms de signaux supplémentaires.
- Les noms qui commencent par
SIG_
suivis d'une lettre majuscule sont réservés
- pour des actions de signal supplémentaires.
- Les noms commençant par
str
, mem
ou wcs
suivis d'une lettre minuscule sont réservés
- pour des fonctions de chaîne et de tableau supplémentaires.
- Les noms commençant par
PRI
ou SCN
suivis d'une lettre minuscule ou X
sont réservés
- pour des macros de spécificateur de format supplémentaires
- Les noms qui se terminent par
_t
sont réservés
- pour les noms de type supplémentaires.
Bien que l'utilisation de ces noms à vos propres fins en ce moment ne puisse pas poser de problème, ils soulèvent la possibilité d'un conflit avec les futures versions de cette norme.
Personnellement, je ne démarre tout simplement pas les identifiants avec des traits de soulignement. Nouvel ajout à ma règle: n'utilisez pas de soulignements doubles n'importe où, ce qui est facile car j'utilise rarement des traits de soulignement.
Après avoir fait des recherches sur cet article, je ne termine plus mes identifiants avec _t
car cela est réservé par la norme POSIX.
La règle concernant tout identifiant se terminant par _t
m'a beaucoup surpris. Je pense que c'est un standard POSIX (pas encore sûr) à la recherche de clarifications et de chapitres et versets officiels. Ceci provient du manuel GNU libtool , listant les noms réservés.
CesarB a fourni le lien suivant vers les symboles réservés POSIX 2004 et note "que de nombreux autres préfixes et suffixes réservés ... peuvent y être trouvés". Les
symboles réservés POSIX 2008 sont définis ici. Les restrictions sont un peu plus nuancées que celles ci-dessus.