最近在看 Linux 内核循环双向链表,细细看的时候有一点不是很明白,请大家帮忙看看
新的内核中 list_entry 这个宏的定义如下:
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
新的内核中 container_of 这个宏的定义如下:
container_of(include/linux/kernel.h)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
http://bbs.csdn.net/topics/392237798
结帖
在新的内核定义中,container_of宏中的临时变量 __mptr 是为了将传递给 container_of 的指针 (ptr) 强制转换为 type 类型的指针,以便通过偏移量 offsetof(type, member) 来计算出整个结构体 type 的起始地址。
__mptr 临时变量的定义是为了在宏展开期间将 (ptr) 转换为正确的指针类型,而不仅仅是为了在宏定义中使用 ptr 变量。
宏展开后的代码将计算 (char *)__mptr - offsetof(type,member),其中 __mptr 是 ptr 强制转换后的指针,而 offsetof(type, member) 是结构体成员 member 在结构体 type 中的偏移量。通过将指针 (char *)__mptr 减去偏移量,我们可以得到整个结构体 type 的起始地址。
然后,这个起始地址被强制转换为 (type *) 类型的指针,以完成从成员指针到结构体指针的转换。
综上所述,临时变量 __mptr 的目的是为了在宏展开期间提供一个类型正确的指针,以便计算结构体的起始地址并完成类型转换。