Une fonction typedef en tant que paramètre d’une autre fonction

typedef int (xxx)(int yyy); signifie définir une fonction nommée xxx avec un paramètre entier. vous pouvez voir ce post SO pour plus de détails.

J’ai essayé cela de différentes manières, c’est mon code:

 #include #include typedef int (xxx)(int yyy); void f1(xxx a) { printf("f1:%d\n",a); } void f2(xxx *a) { printf("f2:%d\n",a); } int test(int y) { } int main() { xxx *a; f1(test); f1(a); f2(test); f2(a); xxx b; printf("xxx's size:%d\n", sizeof(b)); } 

sortie:

 f1:4199274 f1:2 f2:4199274 f2:2 xxx's size:1 

Ma question:

  1. f(xxx a) est-il identique à f(xxx *a) ?
  2. sizeof(someFunction) est défini ou non?

signifie définir une fonction nommée xxx

Il définit un type de fonction.

f (xxx a) est-il identique à f (xxx * a)?

Oui. Mais c’est une sorte de bidouille dans la langue. L’écanvas est simplement ajoutée utilement pour vous car elle manquait.

sizeof (someFunction) est défini ou non?

Ce n’est spécifiquement pas. Vous pouvez le faire avec un langage d’assemblage ou en utilisant une connaissance intime de la façon dont votre programme est lié, mais cela n’a aucune signification sémantique en c. Les fonctions n’ont même pas besoin d’être adressées au-delà des sauts indirects, car C prend en charge les machines à architecture Harvard. (Notez également que deux fonctions du même type auront généralement des tailles différentes, car la taille est déterminée par le nombre et la nature de ses instructions.)

C11 6.3.2.1/4 dit

Un indicateur de fonction est une expression ayant le type de fonction. Sauf s’il s’agit de l’opérande de l’opérateur sizeof,… une désignation de fonction de type ” fonction renvoyant le type ” est convertie en une expression de type ” pointeur sur la fonction renvoyant le type ”.

et 6.5.3.4/1 dit

L’opérateur sizeof ne doit pas être appliqué à une expression ayant le type de fonction…

Il semble que votre compilateur ne parvient pas à appliquer le 6.3.2.1/4. Un message d’erreur est requirejs.