Namespaces
Variants

typedef specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
  • 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

typedef

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