-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Wednesday 30 June 2004 10:38, Nir Tzachar wrote: > hello there ;) > > > 211 #define container_of(ptr, type, member) ({ \ > > 212 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ > > 213 (type *)( (char *)__mptr - offsetof(type,member) );}) > > > > I can't understand the ((type *)0) part - type is passed as an argument > > and it is some struct pointer but the trailing 0 ... what does it > > actually do? > > you need the type of the member, so you can have a proper pointer to it. > you could achieve this by supplying member_type directly, but you dont > need to. by using typeof ((type *)0)->member we get the type of the member > ('type' is the type of the container). > > > offsetof is similar: > > > > <from include/linux/stddef.h> > > 12 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) > > well, lets say you have a structure defined like this: > struct foo { > int a; > int b; > int c; > char d; > }; > > to get the offset of member c in this struct, we need to size of all > members which come b4 c: offset_of_c = sizeof(a)+sizeof(b) . > however, a more generic and _much_ better way: > lets say you had a pointer to a struct foo (foo_ptr), so you can get the > offset like this: > > offset_of_c = &foo_ptr->c - foo_ptr > > the macro actually saves the subtraction, by letting the compiler think > that foo_ptr is 0 ((TYPE *)0) (located at start of memory). Thanks man, really helpful (explained from another perspective, which brings even more clarity). Boris. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFA4oUxiBySr3Fn37QRAv+kAKCzV+gJE9HjG4drzfFkl0XDHAv1/gCgvIAp ICrx4csd8z/nHFMlZocXIIg= =id0u -----END PGP SIGNATURE----- -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/