Un astérisque est-il facultatif dans un pointeur de fonction?

Le code que j’utilise a cette déclaration:

typedef void ( udp_data_notify )(OS_FIFO * pfifo, WORD port); 

Cela ressemble à une déclaration d’un pointeur de fonction pour udp_data_notify, mais il n’y a pas de * . Peut-il toujours s’agir d’un pointeur de fonction sans astérisque?

Voici une déclaration qui utilise udp_data_notify :

 void RegisterUDPFifoWithNotify( WORD dp, OS_FIFO *pnewfifo , udp_data_notify * nudp) 

Toute aide sur ce qui se passe serait appréciée!

Un typedef tel que:

 typedef void name(int); 

(les parenthèses autour du name sont redondantes) définira le name comme type d’une fonction et non comme un pointeur de fonction. Ce serait:

 typedef void (*pname)(int); 

Vous vous demandez probablement à quoi ils servent. Eh bien, les types de fonctions ne sont pas très utiles, sauf pour déclarer des pointeurs:

 name *pointer_to_function; 

Et cela peut être rendu plus lisible avec l’autre typedef:

 pname pointer_to_function; 

C’est parce que vous ne pouvez pas définir une variable de type fonction. Si vous essayez, vous écrirez simplement le prototype d’une fonction, mais avec une syntaxe assez obscure:

 name foo; //declaration (prototype), not variable void foo(int x) //definition { } 

Mais notez que vous ne pouvez pas utiliser le typedef pour définir la fonction:

 name foo {} //syntax error! 

Comme déjà dit, le typedef déclare un alias pour le type de fonction. Lorsque vous souhaitez l’utiliser pour déclarer un pointeur de fonction, un astérisque est requirejs ( udp_data_notify* x ). Une déclaration sans astérisque ( udp_data_notify x ) serait une déclaration de fonction, sauf dans un cas particulier. Lorsqu’il est utilisé dans un paramètre, un type de fonction est automatiquement transformé en type de pointeur de fonction correspondant:

 typedef void F(void); void foo(F a, F* b) // special case; a and b are both function pointers { F c; // function declaration F* d; // function pointer } 

La typedef vous affichez déclare que udp_data_notify est un alias pour un type de fonction. Ensuite, la déclaration de paramètre udp_data_notify *nudp déclare que nudp est un pointeur sur une fonction de ce type. Il n’y a pas d’appel de fonction ici.

En ce qui concerne l’opérateur d’appel de fonction (postfix () ), l’expression qui désigne la fonction appelée doit être un pointeur sur une fonction. Lorsque vous appelez une fonction normalement, sans pointeur, tel que sqrt(2) , la fonction est automatiquement convertie en pointeur. Donc, sqrt(2) est en réalité (&sqrt)(2) . Lorsque vous appelez une fonction avec un pointeur, l’appel est déjà sous la bonne forme.