Espacios de nombres
Variantes
Acciones

Identificador

De cppreference.com
< c‎ | language

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:

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.


Contenido

[editar] Identificadores reservados

Los siguientes identificadores están reservados y no pueden ser declarados en un programa (al hacerlo, se invoca un comportamiento indefinido):

1) Los identificadores que son palabras clave no pueden utilizarse para otros fines. En particular #define o #undef de un identificador que es idéntico a una palabra clave no está permitido.
2) Todos los identificadores externos que comienzan con un guión bajo.
3) Todos los identificadores que comienzan con un guión bajo seguido de una letra mayúscula o de otro guión bajo (estos identificadores reservados permiten a la biblioteca utilizar numerosas macros y funciones no externas detras de escena).
4) Todos los identificadores externos definidos por la biblioteca estándar (en un entorno alojado). Esto significa que no se permite que ningún nombre externo suministrado por el usuario coincida con ningún nombre de biblioteca, ni siquiera si se declara una función idéntica a una función de biblioteca.
5) Identificadores declarados como reservados para uso futuro por la biblioteca estándar, es decir
  • nombres en funciónes
  • cerf, cerfc, cexp2, cexpm1, clog10, clog1p, clog2, clgamma, ctgamma y sus variantes con sufijo -f y -l en <complex.h>
  • comenzando con is ó to seguido de una letra minúscula, en <ctype.h> y <wctype.h>
  • comenzando con str seguido de una letra minúscula, en <stdlib.h>
  • comenzando con str, mem ó wcs seguido de una letra minúscula, en <string.h>
  • comenzando con wcs seguido 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 ó uint y 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>
  • nombres en macros
  • comenzando con E seguido 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 ó UINT y terminando con_MAX, _MIN, ó _C, en <stdint.h>
  • comenzando con PRI ó SCN seguido de la letra minúscula o la letra X, 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>
  • 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>

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.

[editar] 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:

  • 31 caracteres iniciales significativos en un identificador interno o un nombre de macro
  • 6 caracteres iniciales significativos en un identificador externo
  • 511 identificadores externos en una unidad de traducción
  • 127 identificadores con ámbito de aplicación del bloque declarados en un bloque
  • 1024 identificadores de macros definidos simultáneamente en una unidad de traducción de preprocesamiento
(hasta C99)
  • 63 caracteres iniciales significativos en un identificador interno o un nombre de macro
  • 31 caracteres iniciales significativos en un identificador externo
  • 4095 identificadores externos en una unidad de traducción
  • 511 identificadores con ámbito de aplicación del bloque declarados en un bloque
  • 4095 identificadores de macros definidos simultáneamente en una unidad de traducción de preprocesamiento
(desde C99)

[editar] 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

[editar] Véase también

Documentación de C++ para Identificadores