Pointeur de fonction converti en une signature différente

Je utiliser une structure de pointeurs de fonction à implémenter une interface pour les différents backends. Les signatures sont très différents, mais les valeurs de retour sont presque tous void, void * ou int.


struct my_interface {
    void  (*func_a)(int i);
    void *(*func_b)(const char *bla);
    ...
    int   (*func_z)(char foo);
};

Mais il n'est pas nécessaire qu'un backends prend en charge les fonctions pour chaque fonction d'interface. J'ai donc deux possibilités, la première option est de vérifier avant chaque appel, si le pointeur est inégale valeur NULL. Je n'aime pas beaucoup parce que de la lisibilité et parce que j'ai peur de l'impact sur les performances (je n'ai pas mesuré, cependant). L'autre option est d'avoir une fonction factice, pour les rares cas une fonction d'interface n'existe pas.

Donc j'aurais besoin d'une fonction factice pour chaque signature, je me demande si il est possible d'avoir un seul pour les différentes valeurs de retour. Et il la jeta à la signature.


#include <stdio.h>

int nothing(void) {return 0;}

typedef int (*cb_t)(int);

int main(void)
{
    cb_t func;
    int i;

    func = (cb_t) nothing;
    i = func(1);

    printf("%d\n", i);

    return 0;
}

J'ai testé ce code avec gcc et il fonctionne. Mais est-il sain d'esprit? Ou peut-il endommager la pile ou il peut causer d'autres problèmes?

EDIT: Merci pour toutes les réponses, j'ai appris aujourd'hui beaucoup sur les conventions d'appel, après un peu de lecture. Et nous avons maintenant une bien meilleure compréhension de ce qui se passe sous le capot.

source d'informationauteur quinmars