Puntatore di funzione typedef?

Sto imparando come caricare dynamicmente le DLL ma quello che non capisco è questa linea

typedef void (*FunctionFunc)(); 

Ho alcune domande. Se qualcuno è in grado di rispondergli, sarei grato.

  1. Perché viene usato typedef ?
  2. La syntax sembra strana; dopo il void non dovrebbe esserci un nome di funzione o qualcosa del genere? Sembra una funzione anonima.
  3. È un puntatore a funzione creato per memorizzare l’indirizzo di memoria di una funzione?

Quindi sono confuso al momento; puoi chiarire le cose per me?

typedef è un costrutto linguistico che associa un nome a un tipo.
Lo usi nello stesso modo in cui useresti il ​​tipo originale, per esempio

  typedef int myinteger; typedef char *mystring; typedef void (*myfunc)(); 

usando loro come

  myinteger i; // is equivalent to int i; mystring s; // is the same as char *s; myfunc f; // compile equally as void (*f)(); 

Come puoi vedere, puoi semplicemente sostituire il nome typedefed con la sua definizione data sopra.

La difficoltà sta nel puntatore alle funzioni di syntax e leggibilità in C e C ++ e il typedef può migliorare la leggibilità di tali dichiarazioni. Tuttavia, la syntax è appropriata, poiché le funzioni, diversamente da altri tipi più semplici, possono avere un valore di ritorno e parametri, quindi la dichiarazione a volte lunga e complessa di un puntatore alla funzione.

La leggibilità potrebbe iniziare a essere davvero complicata con i puntatori agli array di funzioni e altri sapori ancora più indiretti.

Per rispondere alle tue tre domande

  • Perché viene usato typedef? Per facilitare la lettura del codice, in particolare per i puntatori alle funzioni o ai nomi delle strutture.

  • La syntax sembra strana (nel puntatore alla dichiarazione di funzione) Questa syntax non è ovvia da leggere, almeno all’inizio. L’uso di una dichiarazione typedef facilita invece la lettura

  • È un puntatore a funzione creato per memorizzare l’indirizzo di memoria di una funzione? Sì, un puntatore a funzione memorizza l’indirizzo di una funzione. Questo non ha nulla a che fare con il costrutto typedef che facilita solo la scrittura / lettura di un programma; il compilatore semplicemente espande la definizione typedef prima di compilare il codice reale.

Esempio:

 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 
  1. typedef è usato per tipi di alias; in questo caso stai facendo l’aliasing di FunctionFunc per void(*)() .

  2. In effetti la syntax sembra strana, date un’occhiata a questo:

     typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments 
  3. No, questo dice semplicemente al compilatore che il tipo FunctionFunc sarà un puntatore a funzione, non ne definisce uno, come questo:

     FunctionFunc x; void doSomething() { printf("Hello there\n"); } x = &doSomething; x(); //prints "Hello there" 

Senza la parola typedef , in C ++ la dichiarazione dichiarerebbe una variabile FunctionFunc di tipo pointer a funzione di nessun argomento, restituendo void .

Con typedef , invece, definisce FunctionFunc come un nome per quel tipo.

Se puoi usare C ++ 11, potresti voler usare std::function e using parola chiave.

 using FunctionFunc = std::function; 
 #include  #include  /* 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) ); }