写程序,有时为了方便,需要将0强转为指针,进行操作, 其中一种用法,为用来获取某个成员在对象中的offset, 以方便后续的其它操作
例子:
typedef struct
{
int id;
int age;
}people;
//根据 对象中的某一个成员(element)获取其在对象中的偏移
#define offset(obj, element) (long)(&((obj*)0)->element)
//根据对象中某个成员的地址, 获取其对应对象的地址
#define GET_OBJ_FORM_ELEMENT(p_element,obj,element) ((obj*)((char *)(p_element) - (long)(&((obj *)0)->element)))
int main()
{
people* lili = new people;
lili->_id = 1;
lili->_age = 23;
int offs = offset(people, _age);
cout << offs <<endl;
people* hanmeimei = GET_OBJ_FORM_ELEMENT(&(lili->_age), people, _age);
cout << hanmeimei->_id << " " <<hanmeimei->_age <<endl;
return 0;
}
输出结果: 4
1 23
工作中的一个应用:
DLINK 为一个双循环链表的头指针
任何定义的结构 struct 只要把DLINK作为其一个成员,即可将多个struct 串成双链表(通过操作DLINK),而不需要为每种struct都自己定义prev & next指针来串成链表,方便做到扩展。 同时还可根据&DLINK, 来获取其对应的对象的指针。操作双链表时,也是通过DLINK来操作。一般将DLINK作为对象的第一个成员。