515 votes

Typedef fonction pointeur?

Je suis en train d'apprendre comment charger dynamiquement des DLL mais ce que je ne comprends pas, c'est cette ligne

typedef void (*FunctionFunc)();

J'ai quelques questions. Si quelqu'un est capable de leur répondre, je vous serais reconnaissant.

  1. Pourquoi est - typedef utilisé?
  2. La syntaxe semble étrange; après void ne doit-il pas être un nom de fonction ou quelque chose? Il ressemble à une fonction anonyme.
  3. Est un pointeur de fonction créée pour stocker l'adresse de la mémoire d'une fonction?

Donc, je suis confus pour le moment, pouvez-vous clarifier les choses pour moi?

533voto

ring0 Points 10346

typedef est une construction du langage qui associe un mot-clé à un type.
Vous l'utilisez de la même façon que vous utilisez le type initiaux, par exemple

  typedef int myinteger;
  typedef char *mystring;
  typedef void (*myfunc)();

de les utiliser comme

  myinteger i;   // is equivalent to    int i;
  mystring s;    // is the same as      char *s;
  myfunc f;      // compile equally as  void (*f)();

Comme vous pouvez le voir, vous pouvez simplement remplacer le typedefed mot avec sa définition donnée ci-dessus.

La difficulté réside dans le pointeur de fonctions syntaxe et de la lisibilité dans le C et le C++, et l' typedef pouvez améliorer la lisibilité de ces déclarations. Toutefois, la syntaxe est approprié, étant donné que les fonctions - contrairement à d'autres types simples - peut avoir une valeur de retour et les paramètres, d'où la nécessité d'utiliser plusieurs mots-clés et des parenthèses pour écrire la déclaration de la fonction.

La lisibilité peut commencer à être vraiment difficile avec des pointeurs de fonctions les tableaux, et quelques autres encore plus indirecte saveurs.

Pour répondre à vos trois questions

  • Pourquoi est typedef utilisé? Afin de faciliter la lecture du code - en particulier pour les pointeurs de fonctions, ou les noms de structure.

  • La syntaxe semble étrange (dans le pointeur de déclaration de fonction) Cette syntaxe n'est pas évident à lire, au moins au début. À l'aide d'un typedef déclaration au lieu de cela facilite la lecture

  • Est un pointeur de fonction créée pour stocker l'adresse de la mémoire d'une fonction? Oui, un pointeur de fonction stocke l'adresse d'une fonction. Cela n'a rien à voir avec l' typedef construire qui seulement la facilité de l'écriture/lecture d'un programme, le compilateur juste élargit la définition de type de définition avant de compiler le code.

Exemple:

typedef int (*t_somefunc)(int,int);

int product(int u, int v) {
  return u*v;
}

t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456

204voto

Jacob Relkin Points 90729
  1. typedef est utilisé pour les types d'alias; dans ce cas, vous utilisez alias FunctionFunc à void(*)() .

  2. En effet, la syntaxe semble étrange, jetez un oeil à ceci:

     typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
     
  3. Non, cela déclare simplement que le type FunctionFunc sera un pointeur de fonction, il n'en définit pas un, comme ceci:

     FunctionFunc x;
    void doSomething() { printf("Hello there\n"); }
    x = &doSomething;
    
    x(); //prints "Hello there"
     

36voto

Sans la mot, en C++, la déclaration devrait déclarer une variable de type pointeur fonction sans argument, retour `` .

Avec le il définit plutôt comme un nom pour ce type.

A bientôt & hth.,

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X