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 ))
为什么要在Wikipedia版本中减去
(char *)0
?在任何情况下,这实际上会有所作为吗? 最佳答案
第一个版本使用强制转换将指针转换为整数,该类型不可移植。
第二个版本在更广泛的编译器中具有更高的可移植性,因为它依赖于编译器的指针算法来获取整数结果而不是类型转换。
顺便说一句,我是将原始代码添加到Wiki条目(Linux表单)的编辑器。后来的编辑器将其更改为更具移植性的版本。
关于c - 为什么要在offsetof()中减去空指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2568674/