Comment déclarer un pointeur de fonction dans l’en-tête et le fichier c?

Je suis un peu confus sur la façon de déclarer un pointeur de fonction dans un fichier d’en-tête. Je veux l’utiliser dans main et dans un fichier appelé menus.c et le déclarer dans menus.h je suppose. Nous voulons initialiser pour pointer vers une certaine fonction.

ça ressemble à ça:

void (*current_menu)(int); 

Qu’écrivons-nous dans menus.c, menus.h et main?

Un pointeur de fonction est toujours un pointeur, ce qui signifie qu’il rest une variable.

Si vous souhaitez qu’une variable soit visible à partir de plusieurs fichiers source, la solution la plus simple consiste à la déclarer extern dans un en-tête, avec la définition ailleurs.

Dans un en-tête:

 extern void (*current_menu)(int); 

Dans un fichier source:

 void (*current_menu)(int) = &the_func_i_want; 

Il est souvent utile d’utiliser typedef avec des pointeurs de fonction pour pouvoir nommer le type en quelque chose de descriptif:

 typedef void (*MenuFunction)(int); 

Ensuite, vous auriez une variable globale de ce type, probablement dans menus.c, et déclarée (avec extern ) dans menus.h:

 static void my_first_menu_function(int x) { printf("the menu function got %d\n", x); } MenuFunction current_menu = my_first_menu_function; 

Depuis main.c, vous pouvez alors faire:

 #include "menu.h" current_menu(4711); 

appeler la fonction actuellement current_menu par current_menu .

Une fonction de pointeur elle-même n’a pas de définition de fonction. Ce n’est rien de plus qu’un pointeur sur un type, le type étant spécifié par le type de retour de la fonction et la liste de parameters. Ce que vous devez faire, c’est définir une fonction avec la même liste de parameters et le même type de retour, puis utiliser votre fonction de pointeur pour conserver l’adresse de cette fonction. Vous pouvez ensuite appeler la fonction via le pointeur.