pointer - typedef c++
Typedef function puntero? (5)
Estoy aprendiendo cómo cargar dinámicamente DLL pero lo que no entiendo es esta línea
typedef void (*FunctionFunc)();
Tengo algunas preguntas. Si alguien es capaz de responderlos, estaría agradecido.
- ¿Por qué se usa
typedef
? - La sintaxis parece extraña; ¿Después de
void
no debería haber un nombre de función o algo? Parece una función anónima. - ¿Se ha creado un puntero de función para almacenar la dirección de memoria de una función?
Así que estoy confundido en este momento; ¿Me puedes aclarar las cosas?
typedef
se utiliza para tipos de alias; en este caso, está aliasingFunctionFunc
tovoid(*)()
.De hecho, la sintaxis parece extraña, mira esto:
typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments
No, esto simplemente le dice al compilador que el tipo
FunctionFunc
será un puntero a función, no define uno, así:FunctionFunc x; void doSomething() { printf("Hello there/n"); } x = &doSomething; x(); //prints "Hello there"
Si puede usar C ++ 11, puede usar la std::function
y using
palabra clave.
using FunctionFunc = std::function<void(int arg1, std::string arg2)>;
Sin la palabra typedef
, en C ++ la declaración declararía un FunctionFunc
variable de tipo puntero a función de no argumentos, devolviendo void
.
Con typedef
, en su lugar, define FunctionFunc
como un nombre para ese tipo.
typedef
es una construcción de 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)();
usándolos 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, simplemente puede reemplazar el nombre escrito con el tipo con la definición dada anteriormente.
La dificultad radica en el puntero a las funciones de sintaxis y 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 y parámetros de retorno, 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 tus 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 impar (en el puntero a la declaración de función) Esa sintaxis no es obvia de leer, al menos al comenzar. Usar una declaración
typedef
facilita la lectura¿Se ha creado un puntero de función para almacenar la dirección de memoria de una función? Sí, un puntero a una 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 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
#include <stdio.h>
#include <math.h>
/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/
// typedef a primitive data type
typedef double distance;
// typedef struct
typedef struct{
int x;
int y;
} point;
//typedef an array
typedef point points[100];
points ps = {0}; // ps is an array of 100 point
// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)
// prototype a function
distance findDistance(point, point);
int main(int argc, char const *argv[])
{
// delcare a function pointer
distanceFun_p func_p;
// initialize the function pointer with a function address
func_p = findDistance;
// initialize two point variables
point p1 = {0,0} , p2 = {1,1};
// call the function through the pointer
distance d = func_p(p1,p2);
printf("the distance is %f/n", d );
return 0;
}
distance findDistance(point p1, point p2)
{
distance xdiff = p1.x - p2.x;
distance ydiff = p1.y - p2.y;
return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
}