可能重复:
Rationale behind the container_of macro in linux/list.h
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})\
为什么我们需要在此处构建mptr
而不是直接将ptr
投射到char*
?
答案 0 :(得分:1)
键入安全性,它确保mptr
与指向member
的指针的类型相同,而不仅仅是强制转换。如果不是,你会收到警告。
答案 1 :(得分:0)
内核中给出的宏有一个类型检查,即它确保ptr
具有与“member
类型指针”类型赋值兼容的类型。
例如,如果偶然ptr
恰好是整数,则演员非常乐意将其解释为char*
。