2
votes

Existe-t-il un "nom de type" pour les fonctions en C?

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 commentaires

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.


3 Réponses :


0
votes

Tapez-le simplement.

typedef void(*Frob)(void);

void f(void)
{
    // your code goes here
}

int main()
{
    Frob fubar = f;
    fubar();
    return 0;
}


3 commentaires

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?



6
votes

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.


0 commentaires

1
votes
fubar *fun;

1 commentaires

Le void typedef (* fubar) (void) est-il vraiment correct? Il semble identique void typedef (* fubar_p) (void) sauf le nom.