container_of()宏

来源:互联网 发布:剑网3淘宝代练 编辑:程序博客网 时间:2024/05/21 10:37

指针ptr指向结构体type中的成员member;通过指针ptr,返回结构体type的起始地址
          type
      |----------|
      |          |
      |          |
      |----------|
ptr-->| member --|
      |----------|
      |          |
      |          |
      |----------|
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr:     the pointer to the member.
* @type:   the type of the container struct this is embedded in.
* @member:  the name of the member within the struct.
* */

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

container_of宏,它的功能是得到包含某个结构成员的结构的指针:
 
其实现如下:
 
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({                      /
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    /
        (type *)( (char *)__mptr - offsetof(type,member) );})
 
    分析可知__mptr指向的是一个type结构里typeof(((type *)0)->member)类型member成员的指针,offsetof(type,member)是这个成员在结构中的偏移,单位是字节,所以为了计算type结构的起始地址,__mptr减去它自己的偏移。

 

 

 

 

原创粉丝点击