typedef
es una construcción de lenguaje que asocia un nombre a un tipo.
que lo utilice la misma manera que utilizaría el tipo original, por ejemplo
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
usarlos como
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
Como se puede ver, sólo podría reemplazar el typedefed nombre con su definición dada arriba.
La dificultad radica en el puntero a la sintaxis de funciones y la legibilidad en C y C++, y el typedef
puede mejorar la legibilidad de tales declaraciones. Sin embargo, la sintaxis es apropiada, ya que las funciones -a diferencia de otros tipos más simples- pueden tener un valor de retorno y parámetros, por lo tanto, la declaración a veces larga y compleja de un puntero a la función.
La legibilidad puede comenzar a ser realmente complicada con los punteros a los arreglos de funciones, y algunos otros sabores aún más indirectos.
para responder a sus tres preguntas
¿Por qué se utiliza typedef? Para facilitar la lectura del código, especialmente para los punteros a funciones o nombres de estructura.
La sintaxis es impar (en el puntero a funcionar declaración) que la sintaxis no es evidente para leer, al menos al comenzar. Usar una declaración typedef
en su lugar facilita la lectura
¿Se ha creado un puntero a función para almacenar la dirección de memoria de una función? Sí, un puntero de función almacena la dirección de una función. Esto no tiene nada que ver con la construcción typedef
que solo facilita la escritura/lectura de un programa; el compilador simplemente expande la definición de typedef antes de compilar el código real.
Ejemplo:
typedef int (*t_somefunc)(int,int);
int product(int u, int v) {
return u*v;
}
t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456
Echa un vistazo al enlace (última sección) http://www.learncpp.com/cpp-tutorial/78-function-pointers/ – enthusiasticgeek
Debe tenerse en cuenta que, dado que C++ 11 'usando FunctionFunc = void (*)(); 'se puede usar en su lugar. Es un poco más claro que solo está declarando un nombre para un tipo (puntero a función) – user362515
solo para agregar a @ user362515, una forma un poco más clara para mí es: 'using FunctionFunc = void (void);' – topspin