Comment typedef fonctionne pour les pointeurs de fonction
Je pense que je souffre peut-être de la redoutable "accidentelle programmeur" de la maladie, au moins quand il s'agit de typedefs et des pointeurs de fonction. J'ai donc été à expérimenter avec tous les types de combinaisons associant ces derniers à analyser les résultats en fonction de tous les résultats que j'obtiens.
Mais comme j'ai continué à essayer différentes combinaisons, au lieu d'analyser les résultats maintenant, je suis juste perdu dans le processus.
J'espère que vous allez m'aider à comprendre ce gâchis.
Premier exemple de code
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print *pr;
pr = &do_something;
pr(); //Hello World
Deuxième exemple de code
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print *pr;
pr = do_something;
pr(); //Hello World
Comment faire à la fois le code ci-dessus des exemples de travail, c'est comme si "& " n'a aucun effet sur le nom de la fonction
troisième exemple de code
typedef void (print)(void);
void do_something (void) { printf("Hello World\n"); }
print pr;
pr = do_something; //compile error
pr = &do_something; //compile error
pr();
J'espérais que l'un des ci-dessus affectations de travail ici, mais putain! Je ne comprends vraiment pas des pointeurs de fonction (et peut-être typedef trop).
Euh... je pense que vous devriez obtenir vous-même un "Expert en Programmation C' il explians C du var définir des règles. Je vais essayer de les trouver en ligne pour vous
juste google Expert de la programmation en C, le premier est le livre. Recherche de "Comment une Déclaration Est Formé" et je pense que vous aurez la réponse
OriginalL'auteur Raja | 2012-02-20
Vous devez vous connecter pour publier un commentaire.
L'adresse d'un nom de fonction et de la plaine du nom de la fonction à la fois signifier la même chose, donc
&
n'a aucun effet sur le nom d'une fonction.De même, lors de l'utilisation de pointeurs de fonction, plusieurs déréférencement n'est pas un problème:
Qui compile proprement sous:
Je ne prétends pas que plusieurs étoiles est un bon style; il ne l'est pas. Il est "étrange, et (oui, vous pouvez le dire) perverses". L'un est suffisant (et l'une étoile est surtout pour les gens comme moi qui ont appris à programmer en C avant de le standard dit "c'est OK pour appeler une fonction par l'intermédiaire d'un pointeur sans l'aide de la
(*pointer_to_function)(arg1, arg2)
la notation; il vous suffit d'écrirepointer_to_function(arg1, arg2)
si vous le souhaitez"). Oui, c'est bizarre. Non, aucun autre type (ou classe de types) présente le même comportement, dieu merci.+1, pour le rendre clair, les fonctions et les pointeurs de fonction ne sont pas les mêmes, mais la première tend automatiquement à la carie de ce dernier dans la plupart des cas (mais pas tous). Dans l'expression
**f2
, le pointeur de fonction obtient déréférencé et la fonction se décompose immédiatement en arrière d'un pointeur, ce qui est ensuite de nouveau déréférencé.Les tableaux ont un semblable, mais non identique, automatique "désintégration" de comportement. Pour
int x[10];
, les adresses dex
et&x
sont les mêmes. Mais leur type est différent, et vous ne pouvez pas utiliser le beau ciel de la tour montré ici.OriginalL'auteur Jonathan Leffler
La chose au sujet des pointeurs de fonction est qu'ils sont fonction pointeurs! 🙂 C'est la façon dont vous obtenez votre troisième échantillon de travail:
En termes de savoir si vous utilisez
funcName
ou&funcName
, il n'a pas d'importance (en C au moins). Section6.3.2.1 Lvalues, arrays and function designators
états:OriginalL'auteur paxdiablo
Il s'avère que, en C/C++, les deux
funcname
et&funcname
donnera l'adresse defuncname
et peut être attribué à un pointeur de fonction variable. C'est en fait juste une bizarrerie de la façon dont la syntaxe a été conçu pour la /les langue(s).OriginalL'auteur reuben
Comme le C, le C++ a pointeur de fonctions:
void (*)()
, par exemple, est un pointeur vers une fonction qui ne prend aucun argument et ne renvoie aucune valeur. Cependant, le C++ a également introduit des références à des fonctionsvoid (&)()
et il y a des conversions implicites entre les deux (bien que je ne me souviens pas les règles exactement).Donc:
funcname
est une référence à la fonction&funcname
est un pointeur vers la fonctionNoter que la prise de l'adresse (ou une référence) une fonction qui est surchargé nécessite un
static_cast
pour le type exact (pour résoudre la surcharge).OriginalL'auteur Matthieu M.