当前位置: 技术问答>linux和unix
谁帮我看看这个宏是什么意思?
来源: 互联网 发布时间:2015-10-10
本文导语: #define rb_entry(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0) -> member))) | (unsigned long)(&((type *)0) -> member) 这个是求出member在type类型里头的偏移量 你可以把0替...
#define rb_entry(ptr, type, member)
((type *)((char *)(ptr) - (unsigned long)(&((type *)0) -> member)))
((type *)((char *)(ptr) - (unsigned long)(&((type *)0) -> member)))
|
(unsigned long)(&((type *)0) -> member) 这个是求出member在type类型里头的偏移量
你可以把0替换成temp理解 就成了 (&((type *)temp) -> member) 就是求member的地址,其地址算法为 temp地址+member在temp里头的偏移量 当 temp=0时候 就算出的是偏移量
假如现在我们知道了偏移量,又知道了member的地址,那么 temp的地址就是member地址减去偏移量
#define rb_entry(ptr, type, member)
((type *)((char *)(ptr) - (unsigned long)(&((type *)0) -> member)))
这个ptr就是member的地址,type是整个结构体的类型
也就是说这段宏的功能是求结构体的首地址
你可以把0替换成temp理解 就成了 (&((type *)temp) -> member) 就是求member的地址,其地址算法为 temp地址+member在temp里头的偏移量 当 temp=0时候 就算出的是偏移量
假如现在我们知道了偏移量,又知道了member的地址,那么 temp的地址就是member地址减去偏移量
#define rb_entry(ptr, type, member)
((type *)((char *)(ptr) - (unsigned long)(&((type *)0) -> member)))
这个ptr就是member的地址,type是整个结构体的类型
也就是说这段宏的功能是求结构体的首地址
|
这是因为指针的加减运算是和指针所指类型的size相关。比如,一个size为8的类型的指针p,那么p-1的真实值就比p后退了8个字节。所以在宏中,先把指针类型改为char *型,为了让p-n只后退n个字节。