Especificador typedef
typedef
- crea un alias que se puede usar en lugar del nombre de tipo (que puede ser complejo) .
Contenido |
[editar] Explicación
El especificador typedef, cuando se usa en una declaración, especifica que la declaración es una “declaración typedef”, en vez de una declaración de variable o función. Normalmente, el especificador typedef aparece al principio de la declaración, aunque está permitido que aparezca después de los especificadores de tipo, o entre dos especificadores de tipo.
Una declaración typedef puede declarar uno o varios identificadores en la misma línea (por ejemplo, int y un puntero a int), puede declarar tipos array y funciones, punteros y referencias, tipos de clase, etc. Cada identificador introducido en esta declaración se convierte en un nombre-typedef, que es un sinónimo del tipo del objeto o función en el que se convertiría si se eliminara la palabra clave typedef.
El especificador typedef no se puede combinar con ningún otro especificador, excepto especificadores de tipo.
Los nombres-typedef son alias de tipos existentes, no declaraciones de tipos nuevos. No se puede usar Typedef para cambiar el significado de un nombre de tipo (incluyendo un nombre-typedef). Una vez se declara, un nombre-typedef solo puede volver al declararse para hacer referencia al mismo tipo. Los nombres-typedef solamente tienen efecto en el ámbito donde son visibles: diferentes funciones o declaraciones de clase pueden definir tipos con nombres idénticos con significado diferente.
El especificador typedef struct X {}; // incorrecto |
(desde C++17) |
[editar] nombre-typedef en el enlazado
Formalmente, si la declaración typdef define una clase o enumerado sin nombre, el primer nombre-typedef declarado en la declaración como ese tipo de clase o enumerado se usa para denotar el tipo de clase o enumerado únicamente con fines de enlazado. Por ejemplo, en typedef struct { /* ... */ } S;, S es un nombre-typdef con el propósito de enlazado. El tipo clase o enumerado definido de esta forma tiene enlazado externo (a no ser que esté en un espacio de nombres sin nombre).
Una clase sin nombre definida de esta manera solamente puede contener constructores compatibles con C. En concreto, no debe
y todas las clases miembro también debe cumplir estos requisitos (recursivamente). |
(desde C++20) |
[editar] Palabras clave
[editar] Notas
Alias de tipo proporciona la misma funcionalidad con una sintaxis diferente, y también son aplicables a los nombres de plantilla.
[editar] Ejemplo
// typedef sencillo typedef unsigned long ulong; // los dos objetos siguientes tienen el mismo tipo unsigned long l1; ulong l2; // typedef más complicado typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10]; // los dos objetos siguientes tienen el mismo tipo int a1[10]; arr_t a2; // cuidado: los dos objetos siguientes no tienen el mismo const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // lenguaje C común para evitar tener que escribir "struct S" typedef struct {int a; int b;} S, *pS; // los dos objetos siguientes tienen el mismo tipo pS ps1; S* ps2; // error: especificador de clase de almacenamiento no puede aparecer en una declaración typedef // typedef static unsigned int uint; // se puede usar typedef en cualquier lugar en la secuencia del especificador de declaración long unsigned typedef int long ullong; // escrito más convencionalmente como "typedef unsigned long long int ullong;" // std::add_const, como muchas otras metafunciones, usa miembros typedef template< class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // declara un nuevo tipo struct (incompleto) con nombre listNode } listNode; // error: conflicto con la declaración anterior de nombre de struct
[editar] Vea también
Documentación de C para Declaración typedef
|