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?
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?
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.
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.
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
.
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 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.