Typedef declaration
La declaración typedef proporciona una forma de declarar un identificador como un alias de tipo, para ser utilizado para reemplazar un posiblemente complejo nombre de tipo
La palabra clave typedef se utiliza en una declaración , en la posición gramatical de un especificador de clase de almacenamiento , excepto que no afecta al almacenamiento o enlace:
typedef int int_t; // declara int_t como un alias para el tipo int typedef char char_t, *char_p, (*fp)(void); // declara char_t como un alias para char // char_p como un alias para char* // fp como un alias para char(*)(void)
Contenidos |
Explicación
Si una declaración utiliza typedef como especificador de clase de almacenamiento, cada declarador en ella define un identificador como un alias para el tipo especificado. Dado que solo se permite un especificador de clase de almacenamiento en una declaración, la declaración typedef no puede ser static o extern .
La declaración typedef no introduce un tipo distinto, solo establece un sinónimo para un tipo existente, por lo tanto los nombres typedef son compatibles con los tipos que alias. Los nombres typedef comparten el espacio de nombres con identificadores ordinarios como enumeradores, variables y funciones.
|
Un typedef para un VLA solo puede aparecer en el ámbito de bloque. La longitud del array se evalúa cada vez que el flujo de control pasa por la declaración del typedef, a diferencia de la declaración del array en sí: void copyt(int n) { typedef int B[n]; // B es un VLA, su tamaño es n, evaluado ahora n += 1; B a; // el tamaño de a es n desde antes de +=1 int b[n]; // a y b tienen tamaños diferentes for (int i = 1; i < n; i++) a[i-1] = b[i]; } |
(desde C99) |
Notas
typedef name puede ser un incomplete type , que puede completarse como es usual:
typedef int A[]; // A es int[] A a = {1, 2}, b = {3,4,5}; // tipo de a es int[2], tipo de b es int[3]
Las declaraciones typedef se utilizan a menudo para inyectar nombres del espacio de nombres de etiquetas name space en el espacio de nombres ordinario:
typedef struct tnode tnode; // tnode en el espacio de nombres ordinario // es un alias para tnode en el espacio de nombres de etiquetas struct tnode { int count; tnode *left, *right; // igual que struct tnode *left, *right; }; // ahora tnode también es un tipo completo tnode s, *sp; // igual que struct tnode s, *sp;
Incluso pueden evitar usar el espacio de nombres de etiquetas por completo:
typedef struct { double hi, lo; } range; range z, *zp;
Los nombres typedef también se utilizan comúnmente para simplificar la sintaxis de declaraciones complejas:
// arreglo de 5 punteros a funciones que retornan punteros a arreglos de 3 int int (*(*callbacks[5])(void))[3]; // mismo con typedefs typedef int arr_t[3]; // arr_t es arreglo de 3 int typedef arr_t* (*fp)(void); // puntero a función que retorna arr_t* fp callbacks[5];
Las bibliotecas a menudo exponen tipos dependientes del sistema o de la configuración como nombres typedef, para presentar una interfaz consistente a los usuarios o a otros componentes de la biblioteca:
#if defined(_LP64) typedef int wchar_t; #else typedef long wchar_t; #endif
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 6.7.8 Definiciones de tipo (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 6.7.8 Definiciones de tipo (p: TBD)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.7.8 Definiciones de tipo (p: 137-138)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 6.7.7 Definiciones de tipo (p: 123-124)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 3.5.6 Definiciones de tipos
Palabras clave
Véase también
|
Documentación de C++
para
typedef
declaración
|