container_of宏,定义kernel.h中:
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ /
const typeof( ((type *)0)->member ) *__mptr = (ptr); /
(type *)( (char *)__mptr - offsetof(type,member) );})
container_of在Linux Kernel中的应用非常广泛, 它用于从结构体成员获取结构体的地址。定义中:
typeof:这是gcc的C语言扩展保留字, 用于从变量获取类型
offsetof在stddef.h中, 用来获得一个结构体成员的相对偏移量
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
offsetof 是怎么做到的呢?它把0地址强制转化成了TYPE*类型,然后将它的MEMBER成员的地址转化为size_t类型。也就是说如果一个类型为TYPE的结 构体地址从0开始,那么它的MEMBER成员的地址就是MEMBER成员与TYPE类型地址之间的相对偏移量(以ch

最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



