Comment définir un tableau de pointeurs de fonction et les fonctions n’ont pas la même définition d’argument d’entrée?

Est-il possible de définir un tableau de pointeurs de fonctions (et les fonctions n’ont pas le même argument d’entrée) comme indiqué dans le code suivant?

Si oui, que dois-je mettre dans la définition de fonction int (*handler)(/*what Ihave to put here ?*/);

 struct handler_index { const char *name; int (*handler)(/*what Ihave to put here ?*/); }; int handler0 (int a, int b) { printf("%d\n",a+b); } int handler1 (int a, int b, int c) { printf("%d\n",a+b+c); } int handler2 (int a, int b, int c, int d) { printf("%d\n",a+b+c+d); } const struct handler_index handler_index[] = { [0] = {"handler0", handler0}, [1] = {"handler1", handler1}, [2] = {"handler2", handler3}, }; 

Il suffit de mettre rien:

 int (*handler)(); 

cela signifie que la fonction a un nombre et des types de parameters non spécifiés (mais non variables).

Toute fonction qui retourne un int et avec un nombre de parameters variable fixe peut être assignée au handler .

Bien que int (*handler)() autorise effectivement un nombre variable d’arguments pour la fonction, je ne vois aucun avantage à cela. Les pointeurs de fonction sont utiles lorsque vous avez un morceau de code qui prend quelque chose, qui trouve la “bonne chose à faire” (par exemple, en comparant le “nom” à une entrée venant d’ailleurs) et en appelant le pointeur de fonction pour faire tout ce qu’il doit faire. Le code d’appel du pointeur de fonction doit connaître le nombre d’arguments de la fonction (sinon, comment passer le bon nombre et l’ordre des arguments?).

En fait, je ne vois aucune utilisation significative de cela. Oui, vous pouvez passer un nombre variable d’arguments à une fonction, mais le code doit savoir quels arguments la fonction prend.

Sauf si les arguments sont spécifiés d’une manière ou d’une autre dans la définition de la structure – mais vous devez définir un contenu différent pour la structure afin de permettre cela.

Je suggérerais que vous deviez réfléchir à ce que vous essayez d’atteindre, puis proposer une solution au problème, en utilisant probablement une méthode différente.

Ne rien mettre Il suffit de vider les crochets.

 int (*handler)();