#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这个函数的功能用法没什么好说的,
可是,
有没有人注意到,
多加了这个__mptr中间变量有什么意义,
嘿嘿,
类似的, 看一个简单的不能再简单的宏定义:
#define min(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
这些看似没有用的赋值没有用强转, 所以如果你coding的时候用了不匹配的ptr和type, compile的时候就会报错, 这是为了错误处理.