> Date: Wed, 29 Aug 2012 16:35:50 +1000 > From: Peter Hutterer <[email protected]> > > On Tue, Aug 28, 2012 at 10:38:08AM -0700, Jeremy Huddleston Sequoia wrote: > > Some compilers have difficulty with the previous implementation which > > relies on undefined behavior according to the C standard. Using > > offsetof() from <stddef.h> (which most likely just uses > > __builtin_offsetof on modern compilers) allows us to accomplish this > > without ambiguity. > > > > Signed-off-by: Jeremy Huddleston Sequoia <[email protected]> > > > --- > > include/list.h | 10 ++++++---- > > 1 file changed, 6 insertions(+), 4 deletions(-) > > > > diff --git a/include/list.h b/include/list.h > > index d54a207..ae5431c 100644 > > --- a/include/list.h > > +++ b/include/list.h > > @@ -26,6 +26,8 @@ > > #ifndef _XORG_LIST_H_ > > #define _XORG_LIST_H_ > > > > +#include <stddef.h> /* offsetof() */ > > + > > /** > > * @file Classic doubly-link circular list implementation. > > * For real usage examples of the linked list, see the file test/list.c > > @@ -232,7 +234,7 @@ xorg_list_is_empty(struct xorg_list *head) > > */ > > #ifndef container_of > > #define container_of(ptr, type, member) \ > > - (type *)((char *)(ptr) - (char *) &((type *)0)->member) > > + (type *)((char *)(ptr) - (char *) offsetof(type, member)) > > #endif > > > > /** > > @@ -271,9 +273,9 @@ xorg_list_is_empty(struct xorg_list *head) > > #define xorg_list_last_entry(ptr, type, member) \ > > xorg_list_entry((ptr)->prev, type, member) > > > > -#define __container_of(ptr, sample, member) > > \ > > - (void *)((char *)(ptr) \ > > - - ((char *)&(sample)->member - (char *)(sample))) > > +#define __container_of(ptr, sample, member) \ > > + container_of(ptr, typeof(*sample), member) > > typeof is a gcc extension/c99 and I don't think we support that yet, do we?
It's a GCC extension and no present in C99. _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
