Identifier
Un
identificador
es una secuencia arbitrariamente larga de dígitos, guiones bajos, letras latinas minúsculas y mayúsculas
, y caracteres Unicode especificados usando la notación de
\u
y
\U
escape
(desde C99)
, de la clase
XID_Continue
(desde C23)
. Un identificador válido debe comenzar con un carácter que no sea un dígito (letra latina, guion bajo
, o carácter Unicode que no sea un dígito
(desde C99)
(hasta C23)
, o carácter Unicode de la clase
XID_Start
)
(desde C23)
). Los identificadores distinguen entre mayúsculas y minúsculas (las letras minúsculas y mayúsculas son distintas).
Cada identificador debe ajustarse a la
Forma Normal C
.
(desde C23)
Está definido por la implementación si los caracteres Unicode sin procesar (sin escape) están permitidos en identificadores:
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 |
(desde C99)
(hasta C23) |
| Los caracteres definidos por la implementación cuyos puntos de código correspondientes en ISO/IEC 10646 (Unicode) tienen la propiedad XID_Start o XID_Continue pueden aparecer al principio o después del primer carácter de un identificador respectivamente. | (desde C23) |
Los identificadores pueden denotar los siguientes tipos de entidades:
- objetos
- funciones
- etiquetas ( struct , union , o enumerations )
- miembros de estructura o unión
- constantes de enumeración
- typedef nombres
- etiqueta nombres
- macro nombres
- parámetro de macro nombres
Cada identificador, excepto los nombres de macros o los nombres de parámetros de macros, tiene scope , pertenece a un name space , y puede tener linkage . El mismo identificador puede denotar diferentes entidades en diferentes puntos del programa, o puede denotar diferentes entidades en el mismo punto si las entidades están en diferentes name spaces.
Contenidos |
Identificadores reservados
Los siguientes identificadores están reservados y no pueden declararse en un programa (hacerlo invoca comportamiento indefinido):
- Los identificadores que son keywords no pueden utilizarse para otros propósitos. En particular, no se permite #define o #undef de un identificador idéntico a una keyword.
- Todos los identificadores externos que comienzan con un guion bajo.
- Todos los identificadores que comienzan con un guion bajo seguido de una letra mayúscula o de otro guion bajo (estos identificadores reservados permiten a la biblioteca utilizar numerosas macros y funciones internas no externas).
- Todos los identificadores externos definidos por la biblioteca estándar (en entorno hospedado). Esto significa que no se permiten nombres externos proporcionados por el usuario que coincidan con ningún nombre de la biblioteca, ni siquiera al declarar una función idéntica a una función de la biblioteca.
- Identificadores declarados como reservados para la implementación o uso futuro por la biblioteca estándar (ver más abajo).
- Identificadores declarados como potencialmente reservados y proporcionados por la implementación (ver más abajo). (since C23)
Todos los demás identificadores están disponibles. Los identificadores que no están reservados o potencialmente reservados (desde C23) pueden usarse sin temor a colisiones inesperadas al mover programas de un compilador y biblioteca a otro.
Nota: en C++, los identificadores con un doble guion bajo en cualquier parte están reservados en todas partes; en C, solo los que comienzan con un doble guion bajo están reservados.
Identificadores reservados y potencialmente reservados en la biblioteca
La biblioteca estándar reserva cada identificador que proporciona. Los identificadores reservados que tienen enlace externo (por ejemplo, el nombre de cada función estándar) están reservados independientemente de qué cabecera se incluya. Otros identificadores reservados están reservados cuando se incluye cualquiera de sus cabeceras asociadas.
|
Los identificadores potencialmente reservados están destinados a ser utilizados por la implementación y futuras revisiones del estándar. Si un identificador potencialmente reservado es proporcionado por la implementación, se convierte en reservado. Las implementaciones solo pueden proporcionar definiciones externas de identificadores potencialmente reservados que estén reservados como nombres de función. Los identificadores potencialmente reservados que no son proporcionados por la implementación no están reservados. Pueden ser declarados o definidos por el usuario sin comportamiento indefinido. Sin embargo, dicho uso no es portable. |
(desde C23) |
Los siguientes identificadores están reservados o potencialmente reservados (since C23) para la implementación o uso futuro por la biblioteca estándar.
-
nombres de funciones
, todos los cuales están potencialmente reservados
(desde 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(desde C23) y sus variantes con sufijos -f y -l, en <complex.h> (desde C99) -
que comienzan con
isotoseguidos de una letra minúscula, en <ctype.h> y <wctype.h> (desde C95) -
que comienzan con
strowcs(desde C23) seguidos de una letra minúscula, en <stdlib.h> y <inttypes.h> (desde C23) -
que comienzan con
cr_, en <math.h> (desde C23) -
que comienzan con
wcsseguidos de una letra minúscula, en <wchar.h> (desde C95) -
que comienzan con
atomic_seguidos de una letra minúscula, en <stdatomic.h> (desde C11) -
que comienzan con
cnd_,mtx_,thrd_otss_seguidos de una letra minúscula, en <threads.h> (desde C11)
-
-
nombres de typedef
, todos los cuales están potencialmente reservados
(desde C23)
-
que comienzan con
intouinty terminan con_t, en <stdint.h> (desde C99) -
que comienzan con
atomic_omemory_seguidos de una letra minúscula, en <stdatomic.h> (desde C11) -
que comienzan con
cnd_,mtx_,thrd_otss_seguidos de una letra minúscula, en <threads.h> (desde C11)
-
que comienzan con
-
nombres de macros
-
que comienzan con
Eseguido de un dígito o una letra mayúscula, en <errno.h> -
que comienzan con
FE_seguido de una letra mayúscula, en <fenv.h> (desde C99) -
que comienzan con
DBL_,DEC32_,DEC64_,DEC128_,DEC_,FLT_, oLDBL_seguido de una letra mayúscula, en <float.h> ; estos identificadores están potencialmente reservados (desde C23) -
que comienzan con
INToUINTy terminan con_MAX,_MIN,_WIDTH(desde C23) , o_C, en <stdint.h> ; estos identificadores están potencialmente reservados (desde C23) (desde C99) -
que comienzan con
PRIoSCNseguido de una letra minúscula o la letraX, en <inttypes.h> ; estos identificadores están potencialmente reservados (desde C23) (desde C99) -
que comienzan con
LC_seguido de una letra mayúscula, en <locale.h> -
que comienzan con
FP_seguido de una letra mayúscula, en <math.h> (desde C23) -
que comienzan con
MATH_seguido de una letra mayúscula, en <math.h> ; estos identificadores están potencialmente reservados (desde C23) -
que comienzan con
SIGoSIG_seguido de una letra mayúscula, en <signal.h> -
que comienzan con
TIME_seguido de una letra mayúscula, en <time.h> (desde C11) -
que comienzan con
ATOMIC_seguido de una letra mayúscula, en <stdatomic.h> ; estos identificadores están potencialmente reservados (desde C23) (desde C11)
-
que comienzan con
-
constantes de enumeración
, todas las cuales están potencialmente reservadas
(desde C23)
-
que comienzan con
memory_order_seguido de una letra minúscula, en <stdatomic.h> (desde C11) -
que comienzan con
cnd_,mtx_,thrd_otss_seguido de una letra minúscula, en <threads.h> (desde C11)
-
que comienzan con
|
Se recomienda que las implementaciones emitan una advertencia al declarar o definir identificadores potencialmente reservados, excepto cuando
|
(since C23) |
Límites de traducción
Aunque no existe un límite específico en la longitud de los identificadores, los primeros compiladores tenían límites en el número de caracteres iniciales significativos en los identificadores y los enlazadores imponían límites más estrictos en los nombres con enlace externo . C requiere que al menos los siguientes límites sean compatibles con cualquier implementación conforme al estándar:
|
(hasta C99) |
|
(desde C99) |
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 5.2.5.2 Límites de traducción (p: TBD)
-
- 6.4.2 Identificadores (p: TBD)
-
- 6.10.10 Nombres de macros predefinidos (p: TBD)
-
- 6.11.7 Nombres de macros predefinidos (p: TBD)
-
- 7.33 Direcciones futuras de biblioteca (p: TBD)
-
- K.3.1.2 Identificadores reservados (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 5.2.4.1 Límites de traducción (p: 19-20)
-
- 6.4.2 Identificadores (p: 43)
-
- 6.10.8 Nombres de macros predefinidos (p: 127-129)
-
- 6.11.9 Nombres de macros predefinidos (p: 130)
-
- 7.31 Direcciones futuras de biblioteca (p: 332-333)
-
- K.3.1.2 Identificadores reservados (p: 425)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 5.2.4.1 Límites de traducción (p: 25-26)
-
- 6.4.2 Identificadores (p: 59-60)
-
- 6.10.8 Nombres de macros predefinidos (p: 175-176)
-
- 6.11.9 Nombres de macros predefinidos (p: 179)
-
- 7.31 Direcciones futuras de la biblioteca (p: 455-457)
-
- K.3.1.2 Identificadores reservados (p: 584)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 5.2.4.1 Límites de traducción (p: 20-21)
-
- 6.4.2 Identificadores (p: 51-52)
-
- 6.10.8 Nombres de macros predefinidos (p: 160-161)
-
- 6.11.9 Nombres de macros predefinidos (p: 163)
-
- 7.26 Direcciones futuras de biblioteca (p: 401-402)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 2.2.4.1 Límites de traducción
-
- 3.1.2 Identificadores
-
- 3.8.8 Nombres de macros predefinidos
Véase también
|
Documentación de C++
para
Identifiers
|