de Linux stddef.h define como offsetof()
:¿Por qué restar el puntero nulo en offsetof()?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
mientras que el artículo de Wikipedia sobre offsetof()
(http://en.wikipedia.org/wiki/Offsetof) lo define como:
#define offsetof(st, m) \
((size_t) ((char *)&((st *)(0))->m - (char *)0))
Por qué restar (char *)0
en la versión de Wikipedia? ¿Hay algún caso en el que eso realmente marque la diferencia?
No debe usar/estudiar código que pueda invocar un comportamiento no definido, como el anterior. Una implementación puede usar tales hack skanky porque saben qué tipos de comportamiento indefinido funcionan en secreto. Pero lo que "secretamente funciona" no es totalmente portátil. – CTMacUser