82 votes

Typedef indique une bonne idée?

J'ai parcouru du code et remarqué que la convention consistait à transformer des types de pointeur comme

 SomeStruct*
 

dans

 typedef SomeStruct* pSomeStruct;
 

Y at-il un mérite à cela?

111voto

Artelius Points 25772

Cela peut être approprié lorsque le pointeur lui-même peut être considéré comme une "boîte noire", c'est un morceau de données, dont la représentation interne doit être pertinent pour le code.

Essentiellement, si votre code ne jamais déréférencer le pointeur, et vous venez de le passer autour de fonctions de l'API (parfois par référence), alors non seulement la définition de type de réduire le nombre d' *s dans votre code, mais suggère également pour le programmeur que le pointeur ne devrait pas vraiment être touché.

Cela rend également plus facile de changer l'API dans l'avenir si le besoin s'en fait sentir, par exemple à l'aide d'un ID plutôt qu'un pointeur (ou vice versa). Depuis le pointeur n'a jamais été censé être déréférencé en premier lieu, le code existant ne se cassera pas.

78voto

sigjuice Points 9166

Pas dans mon expérience. Cacher le ' * ' rend le code difficile à lire.

28voto

Jonathan Leffler Points 299946

La seule fois que j'utilise un pointeur à l'intérieur de la définition de type est lorsque vous traitez avec des pointeurs de fonctions:

typedef void (*SigCatcher(int, void (*)(int)))(int);

typedef void (*SigCatcher)(int);

SigCatcher old = signal(SIGINT, SIG_IGN);

Sinon, je les trouve plus de confusion que de bien.


L'a frappé-out déclaration est le type d'un pointeur vers l' signal() de la fonction, non du signal de détecteur. Il pourrait être rendue plus claire (à l'aide du corrigé SigCatcher type ci-dessus) en écrivant:
 typedef SigCatcher (*SignalFunction)(int, SigCatcher);

Ou, pour déclarer l' signal() fonction de:

 extern SigCatcher signal(int, SigCatcher);

C'est, une SignalFunction est un pointeur vers une fonction qui prend deux arguments (un int et SigCatcher) et renvoie un SigCatcher. Et signal() lui-même est une fonction qui prend deux arguments (un int et SigCatcher) et renvoie un SigCatcher.

16voto

Glorphindale Points 650

Cela peut vous aider à éviter certaines erreurs. Par exemple dans le code suivant:

 int* pointer1, pointer2;
 

pointer2 n'est pas un int * , c'est simple int . Mais avec les typedefs cela n'arrivera pas:

 typedef int* pInt;
pInt pointer1, pointer2;
 

Ils sont tous les deux int * maintenant.

5voto

JaredPar Points 333733

C'est une question de style. Vous voyez ce type de code très fréquemment dans les fichiers d’en-tête de Windows. Bien qu'ils aient tendance à préférer la version tout en majuscule au lieu de préfixer par une minuscule p.

Personnellement, j'évite cette utilisation de typedef. Il est beaucoup plus clair que l'utilisateur dise explicitement qu'il veut un Foo * plutôt que PFoo. Les typedef sont les mieux adaptés ces jours-ci pour rendre lisible STL :)

 typedef stl::map<stl::wstring,CAdapt<CComPtr<IFoo>> NameToFooMap;
 

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