container_of

linux内核中的container_of的实现:

代码:

#define container_of(ptr, type, member) ({\
const typeof( ((type *)0)->member) *__mptr = (ptr);\
(type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(type, member) ( (unsigned int) &( (type *)0)->member))

注:typeof是GCC针对c语言的一个扩展关键字,他的作用是得出其参数的具体类型.

 

问:为什么要定义变量__mptr?而不是这样定义:

#define container_of(ptr, type, member) ({\
(type *)( (char *)ptr - offsetof(type,member));})

原因:前一种可以强迫宏进行类型检查。宏定义本身并不会进行类型检查,而这种表达方法会迫
使编译器检查type类型是否包含member成员。同时,如果编译器在编译的时候打开了优化选
项,那么__mptr这个变量也会别优化掉,最终生成的代码与(type *)( (char *)ptr - offsetof(type,member));})表达式生成<F5>的代码也没有什么不同。这样就可以进行类型检
查,提高安全性,同时效率上又没有浪费。

posted @ 2013-02-28 12:08  svking  阅读(391)  评论(0编辑  收藏  举报