以下代码来自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行的作用。我知道这两行在上面的注释中做了什么,但我不会逐字逐句地理解代码。你能解释一下吗?
答案 0 :(得分:0)
646 - >首先为成员创建一个指针(__mptr)。首先创建一个空指针。这是查找成员类型所必需的(成员的类型不作为参数提供!)。
647 - >将创建的指针(__mptr)转换为char *。然后使用' offsetof'找到该成员的偏移量。限定。然后从铸造的__mptr中减去偏移量。需要完成转换,因为offsetof给出的结果以字节为单位。否则,容器的开头未正确计算(使用指针计算基于指针类型) 需要额外强制转换为第647行的类型*,因为需要返回正确类型的指针。
答案 1 :(得分:0)
意图是给定一个匿名指针,你知道它实际上是一个指向更大结构的某个元素的指针,计算那个更大结构的起始地址。