Marc Espie �crivit :
> Attention, je crois qu'on melange deux trucs.
C'est bien possible, merci de recentrer.
> Jerome se demande si ce qu'il fait fonctionne avec du C standard de
> facon portable.
Et justement, je ne trouve que ce soit une tr�s bonne id�e.
Pour m�moire, il voudrait manipuler des fonctions prenant des types
pointeurs vari�s en param�tre, _sans_ utiliser de prototypes.
Ne pas utiliser de prototype est effectivement du C standard, mais je ne
suis pas s�r que ce soit une tr�s bonne solution pour assurer la
portabilit�.
D'un autre c�t�, en termes de perfs, je ne sais pas si les compilateurs
actuels sont assez finaux pour remplacer
void delete_memoire(void*p) { free(p); }
void delete_fichier(void*f) { fclose(p); }
par
.alias delete_memoire, free
.alias delete_fichier, fclose
et �viter l'indirection � inutile �.
Apr�s, et c'est l� que l'on m�lange, il est vrai qu'avec la
quasi-totalit� des machines actuelles, le seul effet de tout cela sera
des avertissements sans frais (m�me avec des prototypes).
Et il est bien clair que la tendance va dans le sens d'avoir de moins en
moins de ces cas particuliers, et au contraire d'avoir tous les
pointeurs (vers objets) avec des repr�sentations identiques.
De plus, un clang r�cent (3.1) proteste de la mani�re ("incompatible
pointer type") quand j'�cris du code qui va marcher � partout �, comme
int (*delete_fichier)(void*) = fclose;
ou si j'�cris du code beaucoup plus tendancieux, genre
int (*delete_memoire)() = free;
/* ... */
if( delete_memoire(&ressource) != 0 ) /* ta-da */
alors m�me que dans le second cas, l'appel ult�rieur avec utilisation de
la valeur retourn�e appelle au meurtre...
Antoine