3 votes

Est-ce que * est obligatoire lors du typage d'un pointeur de fonction ?

Je me suis posé cette question lorsque j'ai écrit un morceau de code "non intentionnel", que j'ai compilé avec succès et que j'ai obtenu le comportement souhaité. Plus tard, j'ai remarqué l'étrangeté du changement et j'ai réalisé que j'avais utilisé un ordre complètement inversé pour effectuer le typage des pointeurs de fonction. Je ne sais plus si l'erreur "involontaire" est en fait syntaxiquement correcte.

Convention habituelle :

typedef void* (*_malloc_fail_handler_ptr)(int) __attribute__ ((unused));
_malloc_fail_handler_ptr _malloc_fail_handler = NULL;

Mon code "involontaire" :

typedef void* (_malloc_fail_handler_ptr)(int) __attribute__ ((unused));
_malloc_fail_handler_ptr* _malloc_fail_handler = NULL;

5voto

songyuanyao Points 2265

La syntaxe est correcte. Pour le 2ème cas, le type de _malloc_fail_handler_ptr est une fonction et non un pointeur de fonction. Le type de _malloc_fail_handler_ptr* est un pointeur sur une fonction. Ainsi, dans les 1er et 2ème cas, le type de la variable _malloc_fail_handler est le même.

3voto

Barry Points 45207

Le seul problème de la seconde est l'appellation :

typedef void* (*_malloc_fail_handler_ptr)(int) __attribute__ ((unused)); 

Il y a, _malloc_fail_handler_ptr es un pointeur sur qui prend un int et de renvoyer void* .

typedef void* (_malloc_fail_handler_ptr)(int) __attribute__ ((unused)); 

Ici, _malloc_fail_handler_ptr est une fonction prenant un int et de renvoyer void* . Il s'agit d'un type de fonction, pas d'un type de pointeur. Le suffixe _ptr est trompeuse. Mais comme pour tout type (en C++, non référentiel), vous pouvez toujours écrire T* pour obtenir un pointeur sur T Cela fonctionne donc.


En simplifiant tout pour éviter la syntaxe maladroite des fonctions, votre question se résume à :

typedef int* ptr;
ptr x = NULL;

contre :

typedef int ptr;
ptr* x = NULL;

Les deux sont syntaxiquement corrects, mais le second est nommé de manière assez trompeuse.

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