Recuerda que en la informática cualquier problema casi siempere suele tener varias soluciones, así que aquí compartiremos lo más óptimo y eficiente.
Solución:
typedef
es una construcción del lenguaje que asocia un nombre a un tipo.
Lo usa de la misma manera que usarí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 puede ver, podría simplemente reemplazar el tipificado nombre con su definición dada arriba.
La dificultad radica en el puntero a la sintaxis y legibilidad de las funciones en C y C++, y la typedef
puede mejorar la legibilidad de dichas 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 función.
La legibilidad puede comenzar a ser realmente complicada con punteros a matrices de funciones y algunos otros sabores aún más indirectos.
Para responder a sus tres preguntas
-
¿Por qué se usa typedef?
Para facilitar la lectura del código, especialmente para punteros a funciones o nombres de estructuras. -
La sintaxis parece extraña (en el puntero a la declaración de función)
Esa sintaxis no es obvia de leer, al menos al principio. Usando untypedef
declaración en cambio facilita la lectura -
¿Se crea un puntero de 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 eltypedef
construcción 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
-
typedef
se utiliza para tipos de alias; en este caso estás haciendo un aliasFunctionFunc
paravoid(*)()
. -
De hecho, la sintaxis parece extraña, eche un vistazo a esto:
typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments
-
No, esto simplemente le dice al compilador que el
FunctionFunc
type será un puntero de función, no definir uno, así:FunctionFunc x; void doSomething() printf("Hello theren"); x = &doSomething; x(); //prints "Hello there"
Sin el typedef
palabra, en C++ la declaración declararía una variable FunctionFunc
de tipo puntero a función sin argumentos, devolviendo void
.
Con el typedef
en su lugar define FunctionFunc
como un nombre para ese tipo.