Identificador
Un identificador es una secuencia arbitrariamente larga de dígitos, guiones bajos, letras latinas minúsculas y mayúsculas , y caracteres Unicode especificados usando notación de escape \u y \U (desde C99). Un identificador válido debe comenzar con un carácter que no sea un dígito (letra latina, guión bajo o carácter Unicode que no sea un dígito (desde C99). Los identificadores distinguen entre mayúsculas y minúsculas (las minúsculas y las mayúsculas son distintas).
|
Se define como implementación si se permiten caracteres Unicode en bruto (no escapados) en los identificadores: char *\U0001f431 = "gato"; // soportado
char *🐱 = "gato"; // implementacion definida (ej. funciona en clang pero no en gcc)
|
(desde C99) |
Los identificadores pueden denotar los siguientes tipos de entidades:
- objetos
- funciones
- etiquetas (estructura, unión, ó enumeración)
- miembros de estructuras o uniones
- constantes de enumeración
- nombres en typedef
- nombres en labels
- nombres en macros
- nombres en parametros de macros
Cada identificador que no sea el nombre de macro o el nombre de parámetro de macro tiene un campo de aplicación, pertenece a un espacio de nombres, y puede tener vinculación. 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 espacios de nombre.
Identificadores reservados
Los siguientes identificadores están reservados y no pueden ser declarados en un programa (al hacerlo, se invoca un comportamiento indefinido):
- nombres en funciónes
cerf,cerfc,cexp2,cexpm1,clog10,clog1p,clog2,clgamma,ctgammay sus variantes con sufijo -f y -l en <complex.h>- comenzando con
isótoseguido de una letra minúscula, en <ctype.h> y <wctype.h> - comenzando con
strseguido de una letra minúscula, en <stdlib.h> - comenzando con
str,memówcsseguido de una letra minúscula, en <string.h> - comenzando con
wcsseguido de una letra minúscula, en <wchar.h> - comenzando con
atomic_seguido de una letra minúscula, en <stdatomic.h> - comenzando con
cnd_,mtx_,thrd_ótss_seguido de una letra minúscula, en <threads.h>
- nombres en typedef
- comenzando con
intóuinty terminando con_t, en <stdint.h> - comenzando con
atomic_ómemory_seguido de una letra minúscula, en <stdatomic.h> - comenzando con
cnd_,mtx_,thrd_ótss_seguido de una letra minúscula, en <threads.h>
- comenzando con
- nombres en macros
- comenzando con
Eseguido de un dígito o de una letra mayúscula, en <errno.h> - comenzando con
FE_seguido de una letra mayúscula, en <fenv.h> - comenzando con
INTóUINTy terminando con_MAX,_MIN, ó_C, en <stdint.h> - comenzando con
PRIóSCNseguido de la letra minúscula o la letraX, en <stdint.h> - comenzando con
LC_seguido de una letra mayúscula, en <locale.h> - comenzando con
SIGóSIG_seguido de una letra mayúscula, en <signal.h> - comenzando con
TIME_seguido de una letra mayúscula, en <time.h> - comenzando con
ATOMIC_seguido de una letra mayúscula, en <stdatomic.h>
- comenzando con
- constantes de enumeración
- comenzando con
memory_order_seguido de una letra minúscula, en <stdatomic.h> - comenzando con
cnd_,mtx_,thrd_ótss_seguido de una letra minúscula, en <threads.h>
- comenzando con
Todos los demás identificadores están disponibles, sin temor a colisiones inesperadas cuando se mueven programas de un compilador y biblioteca a otro.
Nota: en C++, los identificadores con doble guión bajo se reservan en todas partes; en C, sólo se reservan los que comienzan con doble guión bajo.
Límites de traducción
Aunque no hay 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 impusieron límites más estrictos a los nombres con vinculación externa. C requiere que al menos los siguientes límites sean soportados por cualquier implementación que cumpla con los estándares:
|
(hasta C99) |
|
(desde C99) |
Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 5.2.4.1 Translation limits (p: 25-26)
- 6.4.2 Identifiers (p: 59-60)
- 6.10.8 Predefined macro names (p: 175-176)
- 6.11.9 Predefined macro names (p: 179)
- 7.31 Future library directions (p: 455-457)
- K.3.1.2 Reserved identifiers (p: 584)
- Standard C99 (ISO/IEC 9899:1999):
- 5.2.4.1 Translation limits (p: 20-21)
- 6.4.2 Identifiers (p: 51-52)
- 6.10.8 Predefined macro names (p: 160-161)
- 6.11.9 Predefined macro names (p: 163)
- 7.26 Future library directions (p: 401-402)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 2.2.4.1 Translation limits
- 3.1.2 Identifiers
- 3.8.8 Predefined macro names
Véase también
Documentación de C++ para Identificadores
|