Schrober writes: > Hi, > > I wondered why the container_of implementation is so complicated. > > #define container_of(ptr, type, member) ({ \ > const typeof( ((type *)0)->member ) *__mptr = (ptr); \ > (type *)( (char *)__mptr - offsetof(type,member) );}) > > isn't the __mptr not unnecessary? Why not following version? > > #define container_of(ptr, type, member) \ > ((type *)((char *)(ptr) - offsetof(type, member)))
Compile-time type checking. The first version requires ptr to be assignment-compatible with the type of the struct member, the second version accepts random junk for ptr. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/