typedef
specifier
-
-
typedef- crea un alias que puede utilizarse en cualquier lugar en lugar de un nombre de tipo (posiblemente complejo).
-
Contenidos |
Explicación
El typedef especificador, cuando se utiliza en una declaración , especifica que la declaración es una declaración typedef en lugar de una declaración de variable o función.
Normalmente, el typedef aparece al inicio de la declaración, aunque está permitido que aparezca después de los especificadores de tipo , o entre dos especificadores de tipo. El typedef no puede combinarse con ningún otro especificador excepto con 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 de array y función, 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 que se convertiría si se eliminara la palabra clave typedef .
Los nombres typedef son alias para tipos existentes, y no son declaraciones de nuevos tipos. typedef no puede utilizarse para cambiar el significado de un nombre de tipo existente (incluyendo un nombre typedef). Una vez declarado, un nombre typedef solo puede ser redeclarado para referirse al mismo tipo nuevamente. Los nombres typedef solo tienen efecto en el ámbito donde son visibles: diferentes funciones o declaraciones de clase pueden definir tipos con nombres idénticos con diferente significado.
La typedef especificación no puede aparecer en la declaración de un parámetro de función ni en la decl-specifier-seq de una definición de función :
void f1(typedef int param); // mal formado typedef int f2() {} // mal formado
La typedef especificación no puede aparecer en una declaración que no contenga un declarador:
typedef struct X {}; // mal formado
nombre typedef para fines de vinculación
Si una declaración typedef define una class o enumeration sin nombre, el primer nombre typedef del tipo de clase o tipo de enumeración declarado por la declaración es el typedef name for linkage purposes de ese tipo.
Por ejemplo, en
typedef
struct
{
/* ... */
}
S
;
,
S
es un nombre typedef para propósitos de vinculación. El tipo de clase o enumeración definido de esta manera tiene
vinculación externa
(a menos que esté en un espacio de nombres sin nombre).
|
Una clase sin nombre definida de esta manera solo debe contener construcciones compatibles con C. En particular, no debe
y todas las clases de miembros también deben satisfacer estos requisitos (recursivamente). |
(since C++20) |
Notas
|
Los alias de tipo proporcionan la misma funcionalidad que las declaraciones typedef usando una sintaxis diferente, y también son aplicables a nombres de plantillas. |
(desde C++11) |
Palabras clave
Ejemplo
// typedef simple typedef unsigned long ulong; // los siguientes dos objetos 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 siguientes dos objetos tienen el mismo tipo int a1[10]; arr_t a2; // cuidado: los siguientes dos objetos no tienen el mismo tipo const intp_t p1 = 0; // int *const p1 = 0 const int *p2; // expresión idiomática común en C para evitar escribir "struct S" typedef struct { int a; int b; } S, *pS; // los siguientes dos objetos tienen el mismo tipo pS ps1; S* ps2; // error: el especificador de clase de almacenamiento no puede aparecer en una declaración typedef // typedef static unsigned int uint; // typedef puede usarse en cualquier parte de la secuencia de especificadores 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, utiliza typedefs miembros template<class T> struct add_const { typedef const T type; }; typedef struct Node { struct listNode* next; // declara un nuevo tipo de estructura (incompleto) llamado listNode } listNode; // error: entra en conflicto con el nombre de estructura declarado previamente // error C++20: "estructura con nombre typedef para vinculación" tiene funciones miembro typedef struct { void f() {} } C_Incompatible;
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| CWG 576 | C++98 | typedef no estaba permitido en toda la definición de función | permitido en el cuerpo de función |
| CWG 2071 | C++98 | typedef podía aparecer en una declaración que no contenía un declarador | ahora no permitido |
Véase también
|
Documentación de C
para
Declaración Typedef
|