Open Maelan opened 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);
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.
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 :)
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 deCList_foreach
). Ce type est :et non :
.