Linux的stddef.hoffsetof()定义为:

#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/

10-10 13:20