返学费网 > 培训机构 > 南京英贝得嵌入式

025-66911766

全国统一学习专线 8:30-21:00

container_of宏剖析

//该宏位于include/linux/kernel.h

1.定义格式

/**

* 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) );})

作用:就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。

例:

struct demo_struct

{

type1 member1;

type2 member2;

type3 member3;

}

struct demo_struct demo1,*pdemo;

type2 * demo_member2=demo1.member2;

如果要得到demo1的指针,可以使用该宏:

pdemo=container_of(demo_member2,struct demo_struct,member2);

2.宏运行机理解析

typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型。将上例中的宏按照宏定义进行展开,如下:

1 pdemo=({ \

2 const typeof(((struct demo_struct *)0)->member2) *__mptr=(demo_member2); \

3 (struct demo_struct *)((char *)__mptr-offsetof(struct demo_struct, member2));\

4 })

从上面定义来看,代码中的第2行的作用是首先使用typeof获取结构体域变量member2的类型为 type2,然后定义了一个type2指针类型的临时变量__mptr,并将实际结构体变量中的域变量的指针demo_member2的值赋给临时变量__mptr。

第2行代码实际上类似下面定义:

const type2 * __mptr=demo_member2;

这里((struct demo_struct *)0)比较巧妙,它指的是struct demo_struct 型变量地址为基地址,偏移量为0的地址,实际上就是struct demo_struct 型变量地址。

 

温馨提示:为不影响您的学业,来校区前请先电话咨询,方便我校安排相关的专业老师为您解答
  • 热门课程
姓名不能为空
手机号格式错误