Probleme de comprehension de macros
Bonjour,
Me remettant au gout du jour a propos du langage C, je decouvre avec plus d'enthousiasme les joies des macros en C. A vrai dire, devant adapter banc de test de quelqu'un, je me trouve devant ceci ;) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); \
pos = pos->next)
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member)) |
Et la je fais :roll:. Est-ce que quelqu'un pourrait m'expliquer le sens de la premiere macro, car celle-la, elle me pose vraiment du mal. La personne qui l'aurait tape se serait inspire du code du kernel de Linux.C'est un code assez beau pour permettre de d'inserer un element dans une liste chainee. Maintenant, je commence a comprendre la puissance des macros. :mrgreen:
Merci d'avance.
Re: probleme de comprehension de macros
Bonjour,
merci pour cette indication, mujigka. Cela m'a enfin permis de compiler le programme avec gcc qui me renvoyait toujours une erreur avec typeof. Cette extension de C99 est à manier avec précaution et doit dépendre des compilateurs puisque le même code pour la personne qui l'a tapé est compilable.;)
Johnny.
Citation:
La même chose, sans utiliser typeof (GNU C):
Code:
1 2 3 4 5 6 7
| #include <stddef.h>
/* ... */
#define container_of(ptr, type, member) ({ \
const void *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type,member) );}) |
Probleme de comprehension de macros
Bonjour,
merci pour ces indications Emmanuel. Je reflichirais a partir avant d'ecrire de telles sottises. Il est vrai qur je me melange un peu les pinceaux.
Cordialement,
Johnny