kernel.h中的这段代码是什么意思?

时间:2015-03-16 21:42:47

标签: linux list containers

以下代码来自linux内核:

/**
639  * container_of - cast a member of a structure out to the containing structure
640  * @ptr:    the pointer to the member.
641  * @type:   the type of the container struct this is embedded in.
642  * @member: the name of the member within the struct.
643  *
644  */
645 #define container_of(ptr, type, member) ({          \
646     const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
647     (type *)( (char *)__mptr - offsetof(type,member) );})
648 

我无法理解它在646-648行的作用。我知道这两行在上面的注释中做了什么,但我不会逐字逐句地理解代码。你能解释一下吗?

2 个答案:

答案 0 :(得分:0)

646 - >首先为成员创建一个指针(__mptr)。首先创建一个空指针。这是查找成员类型所必需的(成员的类型不作为参数提供!)。

647 - >将创建的指针(__mptr)转换为char *。然后使用' offsetof'找到该成员的偏移量。限定。然后从铸造的__mptr中减去偏移量。需要完成转换,因为offsetof给出的结果以字节为单位。否则,容器的开头未正确计算(使用指针计算基于指针类型) 需要额外强制转换为第647行的类型*,因为需要返回正确类型的指针。

答案 1 :(得分:0)

意图是给定一个匿名指针,你知道它实际上是一个指向更大结构的某个元素的指针,计算那个更大结构的起始地址。