2011-07-25 4 views
2

J'ai une question à propos de typedef en langage c. J'ai lu le code suivant:le typedef de pointeur en langage c

typedef void* (*RT) (int a, int b); 

ce qui est typedefed dans cet exemple?

+2

Cette question vous donne l'information et des liens soient capable de vous décrypter: http://stackoverflow.com/questions/89056/how-do-you-read-c-declarations Enseigner un homme à pêcher et tout ça ... –

Répondre

6

Je vous suggère d'utiliser la "méthode en spirale" bon vieux:

  +---------------------------------+ 
      | +-------------------+   | 
      | | +----+   |   | 
      | | | |   |   | 
      V V V |   |   | 
typedef void * (* RT |) (int a, int b); | 
       | | | |  ^  | 
       | | +--+   |   | 
       | +---------------+   | 
       +------------------------------+ 

suivant la ligne que vous pouvez lire:

  • RT est ...
  • un pointeur vers ...
  • fonction retour ...
  • un pointeur vers ...
  • vide

Vous commencez à partir du nom du type et se déplacer alternativement à droite puis à gauche (respecter la parenthèse comme dans l'exemple).

+0

Jamais entendu parler de ça, intéressant. –

+0

A été publié dans un numéro du bon vieux "Computer Language". En fait la "spirale" est un ajout par moi-même mais le concept est le leur. J'ai trouvé que je me souvenais mieux de cette façon. –

1

RT est un pointeur vers une fonction qui prend deux entiers comme arguments et renvoie un void * (pointeur générique).

4

Ceci est un pointeur vers une fonction retournant void et prenant deux arguments int. Le nom du type est RT.

Lorsque vous avez des doutes, un outil très utile est cdecl.org.

0

Ceci créera un typedef pour un pointeur de fonction au nom RT. Ceci est souvent utilisé pour les fonctions de rappel dans les bibliothèques. Ainsi, lorsqu'une fonction de rappel est requise, la signature de la fonction peut être écrite de manière plus concise avec *RT au lieu de la signature complète.

1

Vous utilisez un pointeur de fonction. RT est le nom de la typedef, void* son type de retour, et deux fois int sont les types d'arguments de la fonction.

2

Voir cdecl:

declare RT as pointer to function (int, int) returning pointer to void 
4
 RT     // RT 
     (*RT)     // is a pointer to 
     (*RT) (    // a function 
     (*RT) (int a, int b); // taking two ints and returning 
    * (*RT) (int a, int b); // a pointer to 
void* (*RT) (int a, int b); // void 
1

Cette déclaration crée RT en tant que nom de type typedef (synonyme) pour le type «pointeur vers fonction prenant deux paramètres int et renvoyant le pointeur vers void». Vous pouvez ensuite utiliser RT de déclarer des objets de ce type, comme ceci:

RT foo, bar; 

par opposition à l'écriture

void *(*foo)(int a, int b), *(*bar)(int a, int b); 

ou

void *(*foo)(int a, int b); 
void *(*bar)(int a, int b);