Identifier
Un
identifiant
est une séquence arbitrairement longue de chiffres, de traits de soulignement, de lettres latines minuscules et majuscules
, et de caractères Unicode spécifiés en utilisant
\u
et
\U
escape
notation
(depuis C99)
, de la classe
XID_Continue
(depuis C23)
. Un identifiant valide doit commencer par un caractère non numérique (lettre latine, trait de soulignement
, ou caractère Unicode non numérique
(depuis C99)
(jusqu'à C23)
, ou caractère Unicode de la classe
XID_Start
)
(depuis C23)
). Les identifiants sont sensibles à la casse (les lettres minuscules et majuscules sont distinctes).
Chaque identifiant doit être conforme à la
Normalization Form C
.
(depuis C23)
Il est défini par l'implémentation si les caractères Unicode bruts (non échappés) sont autorisés dans les identifiants :
char *\U0001f431 = "cat"; // supported char *🐱 = "cat"; // implementation-defined // (e.g. works with Clang, but not GCC prior to version 10) // both are ill formed in C23. Emoji are not XID_Start characters |
(depuis C99)
(jusqu'à C23) |
| Les caractères définis par l'implémentation dont les points de code correspondants dans ISO/CEI 10646 (Unicode) possèdent la propriété XID_Start ou XID_Continue peuvent apparaître respectivement au début ou après le premier caractère d'un identifiant. | (depuis C23) |
Les identifiants peuvent désigner les types d'entités suivants :
- objets
- fonctions
- étiquettes ( struct , union , ou enumerations )
- membres de structure ou d'union
- constantes d'énumération
- typedef noms
- étiquette noms
- macro noms
- paramètre de macro noms
Tout identifiant autre que les noms de macros ou les noms de paramètres de macro possède une portée , appartient à un espace de noms , et peut avoir une liaison . Le même identifiant peut désigner différentes entités à différents endroits du programme, ou peut désigner différentes entités au même endroit si les entités se trouvent dans des espaces de noms différents.
Table des matières |
Identifiants réservés
Les identifiants suivants sont réservés et ne peuvent pas être déclarés dans un programme (le faire invoque un comportement indéfini) :
- Les identifiants qui sont des mots-clés ne peuvent pas être utilisés à d'autres fins. En particulier, #define ou #undef d'un identifiant identique à un mot-clé n'est pas autorisé.
- Tous les identifiants externes qui commencent par un trait de soulignement.
- Tous les identifiants qui commencent par un trait de soulignement suivi d'une lettre majuscule ou d'un autre trait de soulignement (ces identifiants réservés permettent à la bibliothèque d'utiliser de nombreuses macros et fonctions internes non externes).
- Tous les identifiants externes définis par la bibliothèque standard (dans un environnement hébergé). Cela signifie qu'aucun nom externe fourni par l'utilisateur ne peut correspondre à un nom de bibliothèque, même en déclarant une fonction identique à une fonction de bibliothèque.
- Les identifiants déclarés comme réservés à l'implémentation ou à une utilisation future par la bibliothèque standard (voir ci-dessous).
- Les identifiants déclarés comme potentiellement réservés et fournis par l'implémentation (voir ci-dessous). (depuis C23)
Tous les autres identificateurs sont disponibles. Les identificateurs qui ne sont pas réservés ou potentiellement réservés (depuis C23) peuvent être utilisés sans crainte de collisions inattendues lors du transfert de programmes d'un compilateur et d'une bibliothèque à un autre.
Note : en C++, les identifiants avec un double soulignement n'importe où sont réservés partout ; en C, seuls ceux qui commencent par un double soulignement sont réservés.
Identifiants réservés et potentiellement réservés dans la bibliothèque
La bibliothèque standard réserve chaque identifiant qu'elle fournit. Les identifiants réservés qui ont une liaison externe (par exemple le nom de chaque fonction standard) sont réservés quel que soit l'en-tête inclus. Les autres identifiants réservés sont réservés lorsque l'un de leurs en-têtes associés est inclus.
|
Les identifiants potentiellement réservés sont destinés à être utilisés par l'implémentation et les futures révisions de la norme. Si un identifiant potentiellement réservé est fourni par l'implémentation, il devient réservé. Les implémentations sont uniquement autorisées à fournir des définitions externes d'identifiants potentiellement réservés qui sont réservés comme noms de fonctions. Les identifiants potentiellement réservés qui ne sont pas fournis par l'implémentation ne sont pas réservés. Ils peuvent être déclarés ou définis par l'utilisateur sans comportement indéfini. Cependant, une telle utilisation n'est pas portable. |
(depuis C23) |
Les identifiants suivants sont réservés ou potentiellement réservés (depuis C23) pour l'implémentation ou l'utilisation future par la bibliothèque standard.
-
noms de fonctions
, tous potentiellement réservés
(depuis C23)
-
cerf,cerfc,cexp2,cexpm1,clog10,clog1p,clog2,clgamma,ctgamma,csinpi,ccospi,ctanpi,casinpi,cacospi,catanpi,ccompoundn,cpown,cpowr,crootn,crsqrt,cexp10m1,cexp10,cexp2m1,clog10p1,clog2p1,clogp1(depuis C23) et leurs variantes suffixées -f et -l, dans <complex.h> (depuis C99) -
commençant par
isoutosuivi d'une lettre minuscule, dans <ctype.h> et <wctype.h> (depuis C95) -
commençant par
strouwcs(depuis C23) suivi d'une lettre minuscule, dans <stdlib.h> et <inttypes.h> (depuis C23) -
commençant par
cr_, dans <math.h> (depuis C23) -
commençant par
wcssuivi d'une lettre minuscule, dans <wchar.h> (depuis C95) -
commençant par
atomic_suivi d'une lettre minuscule, dans <stdatomic.h> (depuis C11) -
commençant par
cnd_,mtx_,thrd_outss_suivi d'une lettre minuscule, dans <threads.h> (depuis C11)
-
-
noms typedef
, tous potentiellement réservés
(depuis C23)
-
commençant par
intouuintet se terminant par_t, dans <stdint.h> (depuis C99) -
commençant par
atomic_oumemory_suivi d'une lettre minuscule, dans <stdatomic.h> (depuis C11) -
commençant par
cnd_,mtx_,thrd_outss_suivi d'une lettre minuscule, dans <threads.h> (depuis C11)
-
commençant par
-
noms de macros
-
commençant par
Esuivi d'un chiffre ou d'une lettre majuscule, dans <errno.h> -
commençant par
FE_suivi d'une lettre majuscule, dans <fenv.h> (depuis C99) -
commençant par
DBL_,DEC32_,DEC64_,DEC128_,DEC_,FLT_, ouLDBL_suivi d'une lettre majuscule, dans <float.h> ; ces identifiants sont potentiellement réservés (depuis C23) -
commençant par
INTouUINTet se terminant par_MAX,_MIN,_WIDTH(depuis C23) , ou_C, dans <stdint.h> ; ces identifiants sont potentiellement réservés (depuis C23) (depuis C99) -
commençant par
PRIouSCNsuivi d'une lettre minuscule ou de la lettreX, dans <inttypes.h> ; ces identifiants sont potentiellement réservés (depuis C23) (depuis C99) -
commençant par
LC_suivi d'une lettre majuscule, dans <locale.h> -
commençant par
FP_suivi d'une lettre majuscule, dans <math.h> (depuis C23) -
commençant par
MATH_suivi d'une lettre majuscule, dans <math.h> ; ces identifiants sont potentiellement réservés (depuis C23) -
commençant par
SIGouSIG_suivi d'une lettre majuscule, dans <signal.h> -
commençant par
TIME_suivi d'une lettre majuscule, dans <time.h> (depuis C11) -
commençant par
ATOMIC_suivi d'une lettre majuscule, dans <stdatomic.h> ; ces identifiants sont potentiellement réservés (depuis C23) (depuis C11)
-
commençant par
-
constantes d'énumération
, toutes potentiellement réservées
(depuis C23)
-
commençant par
memory_order_suivi d'une lettre minuscule, dans <stdatomic.h> (depuis C11) -
commençant par
cnd_,mtx_,thrd_outss_suivi d'une lettre minuscule, dans <threads.h> (depuis C11)
-
commençant par
|
Il est recommandé que les implémentations avertissent lors de la déclaration ou de la définition d'identifiants potentiellement réservés, sauf lorsque
|
(depuis C23) |
Limites de traduction
Bien qu'il n'y ait pas de limite spécifique sur la longueur des identifiants, les premiers compilateurs avaient des limites sur le nombre de caractères initiaux significatifs dans les identifiants et les éditeurs de liens imposaient des limites plus strictes sur les noms avec liaison externe . Le C exige qu'au moins les limites suivantes soient prises en charge par toute implémentation conforme au standard :
|
(until C99) |
|
(since C99) |
Références
- Norme C23 (ISO/IEC 9899:2024) :
-
- 5.2.5.2 Limites de traduction (p: TBD)
-
- 6.4.2 Identificateurs (p: TBD)
-
- 6.10.10 Noms de macros prédéfinis (p: TBD)
-
- 6.11.7 Noms de macros prédéfinis (p: TBD)
-
- 7.33 Orientations futures de la bibliothèque (p: TBD)
-
- K.3.1.2 Identificateurs réservés (p: TBD)
- Norme C17 (ISO/CEI 9899:2018) :
-
- 5.2.4.1 Limites de traduction (p: 19-20)
-
- 6.4.2 Identificateurs (p: 43)
-
- 6.10.8 Noms de macros prédéfinis (p: 127-129)
-
- 6.11.9 Noms de macros prédéfinis (p: 130)
-
- 7.31 Orientations futures de la bibliothèque (p: 332-333)
-
- K.3.1.2 Identificateurs réservés (p: 425)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 5.2.4.1 Limites de traduction (p: 25-26)
-
- 6.4.2 Identificateurs (p: 59-60)
-
- 6.10.8 Noms de macros prédéfinis (p: 175-176)
-
- 6.11.9 Noms de macros prédéfinis (p: 179)
-
- 7.31 Orientations futures de la bibliothèque (p: 455-457)
-
- K.3.1.2 Identificateurs réservés (p: 584)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 5.2.4.1 Limites de traduction (p. 20-21)
-
- 6.4.2 Identificateurs (p. 51-52)
-
- 6.10.8 Noms de macros prédéfinies (p. 160-161)
-
- 6.11.9 Noms de macros prédéfinies (p. 163)
-
- 7.26 Orientations futures de la bibliothèque (p. 401-402)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 2.2.4.1 Limites de traduction
-
- 3.1.2 Identificateurs
-
- 3.8.8 Noms de macros prédéfinis
Voir aussi
|
Documentation C++
pour
Identifiants
|