¿Puntero de función Typedef?

Resuelto Jack Harvin asked hace 14 años • 6 respuestas

Estoy aprendiendo a cargar DLL dinámicamente pero lo que no entiendo es esta línea

typedef void (*FunctionFunc)();

Tengo algunas preguntas. Si alguien puede responderlas se lo agradecería.

  1. ¿ Por qué se typedefutiliza?
  2. La sintaxis parece extraña; ¿ Después voidno debería haber un nombre de función o algo así? Parece una función anónima.
  3. ¿Se crea un puntero de función para almacenar la dirección de memoria de una función?

Así que estoy confundido en este momento; ¿Puedes aclararme las cosas?

Jack Harvin avatar Nov 28 '10 11:11 Jack Harvin
Aceptado

typedefes una construcción del lenguaje que asocia un nombre a un tipo.
Lo usas de la misma manera que usarías 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, puede simplemente reemplazar el nombre typedefed con la definición dada anteriormente.

La dificultad radica en la sintaxis y legibilidad de las funciones en C y C++, y puede typedefmejorar 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, de ahí la declaración a veces larga y compleja de un puntero a la función.

La legibilidad puede comenzar a ser realmente complicada con punteros a matrices de funciones y algunas otras variantes aún más indirectas.

Para responder a tus tres preguntas

  • ¿Por qué se utiliza 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. En cambio , utilizar una typedefdeclaración 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 la typedefconstrucció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
Déjà vu avatar Nov 28 '2010 05:11 Déjà vu
  1. typedefse utiliza para alias tipos; en este caso le estás asignando un alias FunctionFunca void(*)().

  2. De hecho, la sintaxis parece extraña, eche un vistazo a esto:

    typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
    
  3. No, esto simplemente le dice al compilador que el FunctionFunctipo será un puntero de función, no define uno, así:

    FunctionFunc x;
    void doSomething() { printf("Hello there\n"); }
    x = &doSomething;
    
    x(); //prints "Hello there"
    
Jacob Relkin avatar Nov 28 '2010 04:11 Jacob Relkin

Sin la typedefpalabra, en C++ la declaración declararía una variable FunctionFuncde tipo puntero a función sin argumentos, devolviendo void.

En typedefcambio, se define FunctionFunccomo un nombre para ese tipo.

Cheers and hth. - Alf avatar Nov 28 '2010 04:11 Cheers and hth. - Alf

Si puede utilizar C++ 11, es posible que desee utilizar std::functionuna usingpalabra clave.

using FunctionFunc = std::function<void(int arg1, std::string arg2)>;
Halil avatar Sep 21 '2017 08:09 Halil
#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) );
}
Amjad avatar Jan 11 '2017 22:01 Amjad