kernel.h中的这段代码是什么意思?
What does this piece of code in the kernel.h mean?
以下代码来自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 行的作用。我从上面的注释中知道这两行是做什么的,但我不逐字理解代码。你能给我解释一下吗?
646 -> 首先创建一个指向该成员的指针 (__mptr)。首先创建一个空指针。这是查找成员类型所必需的(成员的 type 未作为参数给出!)。
647 -> 将创建的指针 (__mptr) 转换为 char*。然后使用 'offsetof' 定义找到该成员的偏移量。然后从铸造的 __mptr 中减去偏移量。需要进行转换,因为 offsetof 给出的结果是以字节为单位的。否则容器的开头计算不正确(有指针的计算是根据指针类型计算的)
需要在第 647 行额外转换为 type*,因为需要返回正确类型的指针。
目的是给定一个匿名指针,您知道它实际上是指向更大结构的某个元素的指针,计算那个更大结构的起始地址。
以下代码来自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 行的作用。我从上面的注释中知道这两行是做什么的,但我不逐字理解代码。你能给我解释一下吗?
646 -> 首先创建一个指向该成员的指针 (__mptr)。首先创建一个空指针。这是查找成员类型所必需的(成员的 type 未作为参数给出!)。
647 -> 将创建的指针 (__mptr) 转换为 char*。然后使用 'offsetof' 定义找到该成员的偏移量。然后从铸造的 __mptr 中减去偏移量。需要进行转换,因为 offsetof 给出的结果是以字节为单位的。否则容器的开头计算不正确(有指针的计算是根据指针类型计算的) 需要在第 647 行额外转换为 type*,因为需要返回正确类型的指针。
目的是给定一个匿名指针,您知道它实际上是指向更大结构的某个元素的指针,计算那个更大结构的起始地址。