Buscar..


Introducción

El typedef y (desde C ++ 11) using palabras clave se pueden usar para dar un nuevo nombre a un tipo existente.

Sintaxis

  • typedef type-specifier-seq init-declarator-list ;
  • atributo-especificador-seq typedef decl-especificador-seq init-declarator-list ; // desde C ++ 11
  • utilizando el identificador de atributo identificador -seq ( opt ) = id-tipo ; // desde C ++ 11

Sintaxis básica de typedef

Una declaración typedef tiene la misma sintaxis que una declaración de variable o función, pero contiene la palabra typedef . La presencia de typedef hace que la declaración declare un tipo en lugar de una variable o función.

int T;         // T has type int
typedef int T; // T is an alias for int

int A[100];         // A has type "array of 100 ints"
typedef int A[100]; // A is an alias for the type "array of 100 ints"

Una vez que se ha definido un alias de tipo, se puede usar indistintamente con el nombre original del tipo.

typedef int A[100];
// S is a struct containing an array of 100 ints
struct S {
    A data;
};

typedef nunca crea un tipo distinto. Solo da otra forma de referirse a un tipo existente.

struct S {
    int f(int);
};
typedef int I;
// ok: defines int S::f(int)
I S::f(I x) { return x; }

Usos más complejos de typedef.

La regla de que las declaraciones typedef tienen la misma sintaxis que las declaraciones de variables y funciones ordinarias se pueden usar para leer y escribir declaraciones más complejas.

void (*f)(int);         // f has type "pointer to function of int returning void"
typedef void (*f)(int); // f is an alias for "pointer to function of int returning void"

Esto es especialmente útil para construcciones con sintaxis confusa, como punteros a miembros no estáticos.

void (Foo::*pmf)(int);         // pmf has type "pointer to member function of Foo taking int
                               // and returning void"
typedef void (Foo::*pmf)(int); // pmf is an alias for "pointer to member function of Foo
                               // taking int and returning void"

Es difícil recordar la sintaxis de las siguientes declaraciones de funciones, incluso para programadores experimentados:

void (Foo::*Foo::f(const char*))(int);
int (&g())[100];

typedef se puede utilizar para facilitar su lectura y escritura:

typedef void (Foo::pmf)(int);  // pmf is a pointer to member function type
pmf Foo::f(const char*);       // f is a member function of Foo

typedef int (&ra)[100];        // ra means "reference to array of 100 ints"
ra g();                        // g returns reference to array of 100 ints

Declarando múltiples tipos con typedef

La palabra clave typedef es un especificador, por lo que se aplica por separado a cada declarador. Por lo tanto, cada nombre declarado se refiere al tipo que ese nombre tendría en ausencia de typedef .

int *x, (*p)();         // x has type int*, and p has type int(*)()
typedef int *x, (*p)(); // x is an alias for int*, while p is an alias for int(*)()

Declaración de alias con "utilizando"

C ++ 11

La sintaxis de using es muy simple: el nombre a definir va en el lado izquierdo y la definición en el lado derecho. No es necesario escanear para ver dónde está el nombre.

using I = int;
using A = int[100];             // array of 100 ints
using FP = void(*)(int);        // pointer to function of int returning void
using MP = void (Foo::*)(int);  // pointer to member function of Foo of int returning void

Crear un alias de tipo con el using tiene exactamente el mismo efecto que crear un alias de tipo con typedef . Es simplemente una sintaxis alternativa para lograr lo mismo.

A diferencia de typedef , el using puede ser templado. Una "plantilla typedef" creada con el using se llama una plantilla de alias .



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow