Especificador typedef
typedef- crea un alias que se puede usar en lugar del nombre de tipo (que puede ser complejo) .
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) |
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) |
Palabras clave
Notas
Alias de tipo proporciona la misma funcionalidad con una sintaxis diferente, y también son aplicables a los nombres de plantilla.
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
Vea también
Documentación de C para Declaración typedef
|