如果能够让(unsigned long)(&(type))
的值为0,即&(type) == 0
的时候,那么offset
的值就是简单的:
offset = (unsigned long)(&(type.c));
如果说&(type) == 0
,那么type.c
就可以等价于((Type_t *)0)->c
。
但是这个语句是不能单独存在的,因为对NULL指针访问成员c
是非法的。
可以通过在该语句之前加上&符号,即获取成员c的地址就没问题了。因此,对应的宏如下:
#define OFFSET(TYPE, MEMBER) ((unsigned long)(&(((TYPE *)0)->MEMBER)))
参考:
https://blog.csdn.net/encourage2011/article/details/52463857