Que fait un typedef avec la parenthèse comme “typedef int (f)(void)” signifie? Est-ce un prototype de fonction?
typedef int (fc_name) (void);
Ici fc_name
est valable C symbole.
Combien est différent de ce à partir d'un pointeur de fonction typedef
?
Vous devez vous connecter pour publier un commentaire.
C'est un
typedef
à un type de fonction. Le but est de l'utiliser pour des pointeurs de fonction, mais dans ce cas, la syntaxe à utiliser, il serait:Mise à jour:
Comme mentionné dans les commentaires de Jonathan Leffler réponse, le
typedef
peut être utilisé pour déclarer des fonctions. Une utilisation qui pourrait en être de déclarer un ensemble de fonctions de rappel:La première parenthèses sont superflus - c'est équivalent à:
je ne pense pas que cela n'a rien d'utile, bien que je ne peux pas obtenir de GCC pour s'en plaindre sur son propre.Cela signifie que
fc_name
est un alias pour un type de fonction qui ne prend pas d'arguments et retourne unint
. Elle n'est pas directement tout ce qui utile, si vous pouvez déclarer, par exemple, larand()
fonction à l'aide de:Vous ne pouvez pas utiliser le
typedef
dans une définition de fonction.Un pointeur vers la fonction de définition de type libellé:
Ce code montre que les typedefs sans l'astérisque ne sont pas des pointeurs de fonction (s'adressant à un désormais supprimé alternative la réponse):
Lors de la compilation, 'gcc' dit:
Et ce code montre que vous pouvez en effet utiliser
fc_name *var = funcname;
comme suggéré par jamesdlin:À l'aide de y0, y1 GCC génère des avertissements:
Et, en s'appuyant sur le commentaire de schot:
Intéressant - les coins sombres de la C est trop trouble, en effet.
typedef
pour une fonction déclaration (prototype), mais pas pour un définition. Mais ce n'est pas très utile, sauf pour l'obscurcissement.Intéressant! Une définition de type de déclaration est une déclaration typedef comme le stockage de classe.
plus tard, vous pouvez définir une fonction comme suit,
Vous devriez être en mesure de comprendre cela à partir de la c/c++ standard!
Je n'ai encore jamais vu ce fait à un typedef nom, mais les parenthèses autour du nom d'un fonction sont utiles pour empêcher qu'elle soit développée comme une fonction-comme macro du même nom. Par exemple, le
isxxx
fonctions dansctype.h
sont définis comme les fonctions et macros. C'est donc un pointeur versisalpha
. Mais comment fonctionne la bibliothèque C définir le hors-ligneisalpha
? Sans doute comme cela:L'utilisation de
isalpha
dans le corps de la fonction est développée comme une macro, l'utilisation de la fonction d'en-tête n'est-ce pas.La forme correcte est:
Vous pouvez définir une fonction comme suit:
et puis de définir une variable de point à cette fonction:
et l'appel de la fonction par le pointeur de fonction:
La raison que nous avons besoin de pointeur de fonction, c'est que le langage C n'a pas de fonction prédéfinie pointeur et l'utilisation
void *
pointeur pour appeler une fonction est illégal en langage C.De SORTIE:-
De sorte que la définition de type pour qui j'ai interrogé à propos, (Ligne n ° 4 ici) représente un
type de fonction et n'est pas le même que le pointeur de la fonction définition de type.
Ce genre de typedef n'a pas beaucoup d'importance. Ils sont utilisés comme un
standard de style ou tout simplement pour créer de la dissimulation de l'intentionnellement 😉
int handler_func2(fc_name fptr) { return fptr(); }
parce que la 'fonction' le paramètre est automatiquement considéré comme (converti) un pointeur de fonction.