container_of在Linux内核中是一个常见的宏,用于从包含在某个结构体中的指针获得结构体本身的指针。通俗讲就是通过结构体变量中的某个成员获得整个结构体变量的首地址。
container_of在源码中的定义如下:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
语法分析:其实就是指针的灵活运用。
1.首先通过typeof定义一个与ptr相同的指针变量 __mptr,这是一个临时的数据类型,用它来保存ptr的值。
2.用__mptr减去member在Type结构中的偏移,得到的就是整个结构体变量的首地址。
附:offset宏的定义源码
#ifndef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
typeof(x) y 实现的是将y定义为x的类型