Pregunta ¿Qué significa esta declaración typedef?


En una página de referencia de C ++, brindan algunos ejemplos de tipos de letra e intento entender lo que significan.

// simple typedef
typedef unsigned long mylong;


// more complicated typedef
typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

Entonces el typedef simple (la primera declaración) lo entiendo.

Pero, ¿qué están declarando con el segundo (se repite a continuación)?

typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];

Particularmente lo que hace (&fp)(int, mylong) ¿media?


76
2018-02-27 07:23


origen


Respuestas:


Está declarando varios typedefs a la vez, del mismo modo que puedes declarar varias variables a la vez. Todos son tipos basados ​​en int, pero algunos se modifican en tipos compuestos.

Vamos a dividirlo en declaraciones separadas:

typedef int int_t;              // simple int
typedef int *intp_t;            // pointer to int
typedef int (&fp)(int, ulong);  // reference to function returning int
typedef int arr_t[10];          // array of 10 ints

97
2018-02-27 07:30



typedef int int_t, *intp_t, (&fp)(int, mylong), arr_t[10];

es equivalente a:

typedef int int_t;
typedef int *intp_t;
typedef int (&fp)(int, mylong);
typedef int arr_t[10];

De hecho, hay un ejemplo similar en el estándar C ++ 11:

C ++ 11 7.1.3 los typedef especificador

UN typedef-name no introduce un nuevo tipo de la forma en que class declaración (9.1) o enum declaración hace.Ejemplo: después

typedef int MILES , * KLICKSP ;

las construcciones

MILES distance ;
extern KLICKSP metricp ;

son todas las declaraciones correctas; el tipo de distancia es int la de metricp es "puntero a int. "-Ejemplo


41
2018-02-27 07:26



Si tienes el cdecl comando, puede usarlo para desmitificar estas declaraciones.

cdecl> explain int (&fp)(int, char)
declare fp as reference to function (int, char) returning int
cdecl> explain int (*fp)(int, char)
declare fp as pointer to function (int, char) returning int

Si no tienes cdecl, debe poder instalarlo de la forma habitual (por ejemplo, en sistemas de tipo Debian, utilizando sudo apt-get install cdecl)


32
2018-02-27 07:32



los (&fp)(int, mylong) parte representa una referencia a una función. No se recomienda que los programadores usen funciones en typedef por la misma razón que estás haciendo esta pregunta. Confunde a otras personas que miran el código.

Supongo que usan el typedef en algo como esto:

typedef unsigned long mylong; //for completeness
typedef int (&fp)(int, mylong);
int example(int param1, mylong param2);

int main() {
     fp fp_function = example;
     int x = fp_function(0, 1);
     return 0;
}

int example(int param1, mylong param2) {
     // does stuff here and returns reference
     int x = param1;
     return x;
}

Editado de acuerdo con el comentario de Brian:

int(&name)(...) es un referencia de función llamado name (la función devuelve un int)

int &name(...) es una función llamada name  devolviendo una referencia a un int

Una referencia a una función que devuelve un int referencia sería algo como esto: typedef int &(&fp)(int, mylong) (Esto se compila en un programa, pero el comportamiento no se ha probado).


0
2018-02-27 07:37



typedef está definiendo un nuevo tipo para usar en tu código, como una abreviatura.

typedef typename _MyBase::value_type value_type;
value_type v;
//use v

typename aquí está dejando que el compilador sepa que value_type es un tipo y no un objeto dentro de _MyBase.

el :: es el alcance del tipo. Es algo así como "está en", por lo que value_type "está en" _MyBase. o también se puede pensar que contiene.

Posible duplicado: C ++ - significado de una instrucción que combina typedef y typename


-7
2018-02-27 07:34