with pointer functions c++ c pointers typedef

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.

  1. ¿Por qué se usa typedef ?
  2. 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.
  3. ¿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?


  1. typedef se utiliza para tipos de alias; en este caso, está aliasing FunctionFunc to void(*)() .

  2. De hecho, la sintaxis parece extraña, mira esto:

    typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments

  3. 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) ); }