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>的代码也没有什么不同。这样就可以进行类型检
查,提高安全性,同时效率上又没有浪费。
Keep Looking