di Linux stddef.h definisce offsetof()
come:Perché sottrarre un puntatore nullo in offsetof()?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
, mentre alle voci di Wikipedia offsetof()
(http://en.wikipedia.org/wiki/Offsetof) lo definisce come:
#define offsetof(st, m) \
((size_t) ((char *)&((st *)(0))->m - (char *)0))
Perché sottrarre (char *)0
nella versione Wikipedia? C'è qualche caso in cui ciò potrebbe davvero fare la differenza?
Non si dovrebbe utilizzare/studiare codice che potrebbe richiedere un comportamento non definito, come sopra. Un'implementazione può utilizzare tali hack skanky perché sanno quali tipi di comportamento non definito funzionano segretamente. Ma ciò che "segretamente funziona" non è assolutamente portatile. – CTMacUser