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
?是否存在实际上会产生影响的情况?
答案 0 :(得分:7)
第一个版本将指针转换为带有强制转换的整数,这是不可移植的。
第二个版本在更广泛的编译器中更容易移植,因为它依赖于编译器的指针算法来获得整数结果而不是类型转换。
BTW,我是将原始代码添加到Wiki条目的编辑器,这是Linux表单。后来的编辑将其更改为更便携的版本。
答案 1 :(得分:4)
标准不要求NULL指针计算为位模式0,但可以评估为特定于平台的值。
执行减法可确保在转换为整数值时,NULL为0。