C利用宏求结构体成员的偏移/根据成员的地址求得结构体的地址
定义一个宏求结构体内的成员的偏移量
#define offset (type, member) (size_t)&(((type*)0)->member)
//(type*)0:表示一个type类型的实例是从0地址开始
//((type*)0) -> member:获取(type*)0的内部成员变量member
//&(((type*)0) -> member):获取内部成员变量的地址
//(size_t)&(((type*)0)->member):将地址强制转换成 int数据类型
利用成员变量的地址求结构体的地址
#define offset(type, member) \
(size_t)&(((type*)0)->member)
#define contaniner_ptr(type, member_ptr, member) ({\
decltype( ((type *)0)->member ) *ptr = (member_ptr); \
(type *)( (char *) ptr - offsetof(type,member) ); \
})
// decltype( ((type *)0)->member ) *ptr = (member_ptr); 获取成员的地址
// (type *)( (char *) ptr - offsetof(type,member) );
// (char *) ptr 将成员的地址转换成字节型指针
// (char*)__mptr - offsetof(type,member))用来求出结构体起始地址,这里是为char *型指针
// 在(type *)作用下进行将字节型的结构体起始指针转换为type *型的结构体起始指针。
版权声明:本文为wzx_numberone原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。