mr21 / CList

Mon système de liste chaînée
2 stars 0 forks source link

Type des pointeurs sur fonction #2

Open Maelan opened 12 years ago

Maelan commented 12 years ago

Re-salut,

Tu devrais utiliser le type exact pour les pointeurs sur fonction (le membre des de la liste chaînée, et le paramètre de CList_foreach). Ce type est :

void  (*name)(void*)

et non :

void  (*name)()

.

mr21 commented 12 years ago

hmmm ça par contre ce n'est pas un oublie, c'est un fait exprès. Pourquoi me conseilles-tu cela?

Je me suis dis qu'il serait cool que le destructeur en question fasse un cast implicite en recevant le void*.

void mon_destructeur(MonObjet* objet);

Maelan commented 12 years ago

Sauf que dans ce cas, il n’y a pas de cast puisque le compilateur ne sait pas quel type attend la fonction. Cet appel empile la valeur du pointeur sur void telle quelle, tandis que la fonction appelée la dépile telle quelle également en pensant que c’est un pointeur sur MonObjet.

En pratique ça devrait marcher sur la plupart des systèmes modernes (ceux qui n’utilisent pas la pagination), car dans ce cas on peut supposer que des pointeurs désignant une même adresse auront la même taille et la même valeur quels que soient leurs types pointés, mais ce n’est pas garanti par la norme donc pas portable. Une exception, je pense, est void* et char* qui devraient être compatibles puisqu’ils peuvent tous deux désigner n’importe quelle adresse. Il doit y avoir un paragraphe de la norme pour ça.

Et de plus, ce prototype autorise à mettre n’importe quoi comme arguments, pas seulement un unique pointeur void*. Bref, c’est risqué de se baser sur ça pour le confort d’un cast fait dès l’appel de la fonction (il faudra le faire dans le corps de la fonction appelée), même si je le reconnais, ça aurait été bien pratique.

mr21 commented 12 years ago

Ouai donc en un mot.. c'est pas à la norme quoi? les deux parenthèses collées () ne sont jamais à la norme c'est ça?

Mais dans quel cas des pointeurs n'auraient pas la même taille?

Mais pour ma défense ces fonctions (le (_des) et le (_fun) du foreach) sont appelés par moi, donc JE fais bien les choses, ce n'est pas le user qui, lui, me donnera juste la fonction.

Bref, je garde ça de côté merci bien hein :)