【发布时间】:2011-02-03 20:24:05
【问题描述】:
Linux 的 stddef.h 将 offsetof() 定义为:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
而offsetof() (http://en.wikipedia.org/wiki/Offsetof) 上的维基百科文章将其定义为:
#define offsetof(st, m) \
((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
为什么要在维基百科版本中减去(char *)0?在任何情况下,这实际上会有所作为吗?
【问题讨论】:
-
您不应该使用/研究可能会引发未定义行为的代码,如上述。一个实现可以使用这种卑鄙的黑客,因为他们知道哪些类型的未定义行为会秘密起作用。但是“秘密工作”的东西是完全不可移植的。
标签: c pointer-arithmetic offsetof