Question

Est-il possible de passer un pointeur de fonction comme un argument à une fonction C?

Si oui, comment pourrais-je déclarer et définir une fonction qui prend un pointeur de fonction comme argument?

Était-ce utile?

La solution

Certainement.

void f(void (*a)()) {
    a();
}

void test() {
    printf("hello world\n");
}

int main() {
     f(&test);
     return 0;
}

Autres conseils

Disons que vous avez la fonction

int func(int a, float b);

pointeur vers elle sera

int (*func_pointer)(int, float);

Alors que vous pouvez l'utiliser comme ceci

  func_pointer = func;
  (*func_pointer)(1, 1.0);

  /*below also works*/
  func_pointer(1, 1.0);

Pour éviter de spécifier le type plein pointeur à chaque fois que vous en avez besoin vous coud typedef it

typedef int (*FUNC_PTR)(int, float);

et que d'utiliser comme tout autre type

void executor(FUNC_PTR func)
{ 
   func(1, 1.0);
}

int silly_func(int a, float b)
{ 
  //do some stuff
}

main()
{
  FUNC_PTR ptr;
  ptr = silly_func;
  executor(ptr); 
  /* this should also wotk */
  executor(silly_func)
}

Je suggère de regarder le monde célèbre C faqs.

Ceci est un bon exemple:

int sum(int a, int b)
{
   return a + b;
}

int mul(int a, int b)
{
   return a * b;
}

int div(int a, int b)
{
   return a / b;
}

int mathOp(int (*OpType)(int, int), int a, int b)
{
   return OpType(a, b);
}

int main()
{

   printf("%i,%i", mathOp(sum, 10, 12), mathOp(div, 10, 2));
   return 0;
}
The output is : '22, 5'

Vérifier qsort()

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

Le dernier argument de la fonction est un pointeur de fonction. Lorsque vous appelez qsort() dans un programme de la vôtre, l'exécution « va dans la bibliothèque » et « pas en arrière dans votre propre code » grâce à l'utilisation de ce pointeur.

Comme dit par d'autres réponses, vous pouvez le faire comme dans

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

Cependant, il y a un cas particulier pour déclarer un argument de type pointeur de fonction: si un argument a le type de fonction, il sera converti en un pointeur sur le type de fonction, tout comme les tableaux sont convertis en pointeurs dans les listes de paramètres, de sorte que le premier peut également être écrit comme

void qsort(void *base, size_t nmemb, size_t size,
           int compar(const void *, const void *));

Bien entendu cela s'applique aux seuls paramètres, comme en dehors d'une liste de paramètres int compar(const void *, const void *); déclarerait une fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top