码迷,mamicode.com
首页 > 其他好文 > 详细

list_entry()

时间:2014-07-06 23:16:44      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:type   amp   size   har   ar   c   

macro :

#define list_entry(ptr,type,member)  \

    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

功能  从一个结构的成员指针找到其容器的指针

原理:   ptr是指向type结构体member成员的指针

    &((type *)0)->member

    把0强制转化为指针类型,即0是一个地址,为段基址。取以0为结构体基址的结构体的域变量member的地址,那么这个地址就等于member域到结构体基地址的偏移字节数。

    ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

    ptr是指向类型为type的某结构体中的成员member的指针,减去该member在结构体中的偏移量,即得到该结构体的起始地址。

 

list.h中定义了下面三个宏

#define list_entry(ptr, type, member)  container_of(ptr, type, member)

 

#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})

 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

list_entry(),布布扣,bubuko.com

list_entry()

标签:type   amp   size   har   ar   c   

原文地址:http://www.cnblogs.com/buptlyn/p/3824344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!