Espacios de nombres
Variantes
Acciones

Especificador typedef

De cppreference.com
< cpp‎ | language
 
 
 
 
  • 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 no puede aparecer en una declaración que no tiene un declarador.

typedefstruct 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 typedefstruct{/* ... */} 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

typedef

[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 sencillotypedefunsignedlong ulong;   // los dos objetos siguientes tienen el mismo tipounsignedlong l1; ulong l2;   // typedef más complicadotypedefint int_t, *intp_t, (&fp)(int, ulong), arr_t[10];   // los dos objetos siguientes tienen el mismo tipoint a1[10]; arr_t a2;   // cuidado: los dos objetos siguientes no tienen el mismoconst intp_t p1 =0;// int *const p1 = 0constint*p2;   // lenguaje C común para evitar tener que escribir "struct S"typedefstruct{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ónlongunsignedtypedefintlong ullong;// escrito más convencionalmente como "typedef unsigned long long int ullong;"   // std::add_const, como muchas otras metafunciones, usa miembros typedeftemplate<class T>struct add_const {typedefconst T type;};   typedefstruct 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
close