En C, on peut définir un pointeur de fonction, mais y a-t-il un "type-name" pour ce que le pointeur pointe?
Pour élaborer, au lieu de void (* fubar) (void) on pourrait avoir une définition de type pour pouvoir déclarer fubar comme Frob * fubar < / code>?
3 Réponses :
Tapez-le simplement.
typedef void(*Frob)(void);
void f(void)
{
// your code goes here
}
int main()
{
Frob fubar = f;
fubar();
return 0;
}
Cela ne répond pas à la question. La question était de faire en sorte que Frob * fubar définisse fubar comme un pointeur de fonction. Dans votre cas, cela deviendrait un pointeur vers un pointeur de fonction.
A part "l'étoile", la syntaxe et le comportement sont identiques.
Et pourquoi c'est important?
Il n'y a pas de nom de type standard pour les pointeurs de fonction, comme c'est le cas pour int . De plus, il n'y a pas de mot clé pour nommer une balise pour eux, comme c'est le cas pour struct . À la place, vous devez utiliser typedef si vous voulez faire référence à un prototype de fonction, ou à un pointeur vers une fonction, par son nom.
Considérez le typedef suivant:
Frob foo;
Frob *fubar = foo;
void foo (void) { puts(__func__); }
int main (void) { fubar(); }
Sans le mot-clé typedef , la déclaration serait pour un prototype d'une fonction nommée Frob . Avec typedef , le nom Frob est désormais un alias de type pour les fonctions qui correspondent à ce prototype. Donc, il peut être utilisé comme ceci:
typedef void Frob (void);
En général, typedef fonctionne de cette façon, où il peut transformer une déclaration de variable (sans initialiseur) dans un alias de type.
fubar *fun;
Le void typedef (* fubar) (void) est-il vraiment correct? Il semble identique void typedef (* fubar_p) (void) sauf le nom.
typedef void (Frob) (void); Frob * fubar;Je pense qu'il est faux de créer un lien vers le "pointeur de fonction Typedef" car cette question concerne le type pointé et non le pointeur.
VTRO. Les dupes faisaient référence à un nom de type vers un pointeur de fonction. Ici, un nom de type est recherché pour une fonction. Différence subtile.