#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
最近在看linux kernel中的链表操作, 看到了如上这个宏, 其实表达的意思很简单, 但是他要用一个__mptr来指向ptr甚是不解?实测如下宏也是可行的:
#define container_of(ptr, type, member) ({ \
(type *)( (char *)ptr - offsetof(type,member) );})
内核用一个临时const变量来存储ptr是为什么啊? 并且第一步还要强行获得ptr的对象类型, 第二步又将mptr强转成char *类型, 就我目前的知识来看这种操作好鸡肋, 内核这样做是适应编译器的操作“习惯”吗? 还是说有其它的“难言之隐“?有大神能帮忙解答一下吗?