Linux2.4.0源码:
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif#undef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#endif
offsetof:接受两个参数:TYPE、MEMBER
TYPE:结构体类型
MEMBER:结构体成员((TYPE *)0) :数字0强制转换成 TYPE * 型的指针类型。相当于 ((TYPE *)0) 指向0地址,不论0地址是否合法,是否存在一个结构体对象, ((TYPE *)0)操作后都会把以0地址为首的一片连续内存当成一个结构体对象供offsetof操作。
((TYPE *)0)->MEMBER :((TYPE *)0) 这个指针获取TYPE结构体对象中的MEMBER成员(以只读的方式操作内存,尽管地址不合法,但编译器不会报错)
&((TYPE *)0)->MEMBER:对TYPE结构体对象中的MEMBER成员取地址。
((size_t) &((TYPE *)0)->MEMBER):将对TYPE结构体对象中的MEMBER成员取地址后的对象强转成整形
((TYPE *)0) 以0 地址为首进行操作,获取到TYPE的MEMBER成员的地址,把这个地址强制转换成 size_t 类型,就相当于结构体成员相对于首地址的偏移量
#define Offset(type ,exp) ((int)(&((type*)0)->exp))
struct Student
{
char s_id[10];
char s_name[10];
char s_sex;
int s_age;
char s_addr[20];
double s_score;
int num;
};
int main()
{
cout<<Offset(Student,s_name)<<endl;
cout<<Offset(Student,s_addr)<<endl;
cout<<Offset(Student,num)<<endl;
return 0;
}