6

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为什么要在维基百科版本中减去?在任何情况下,这实际上会有所作为吗?

4

2 回答 2

8

第一个版本通过强制转换将指针转换为整数,这是不可移植的。

第二个版本在更广泛的编译器中更具可移植性,因为它依赖于编译器的指针运算来获得整数结果而不是类型转换。

顺便说一句,我是将原始代码添加到 Wiki 条目(即 Linux 表单)的编辑器。后来的编辑将其更改为更便携的版本。

于 2010-04-02T20:16:32.353 回答
4

该标准不要求 NULL 指针评估为位模式 0,但可以评估为特定于平台的值。

做减法保证当转换为整数值时,NULL 为 0。

于 2010-04-02T19:23:54.303 回答