container_of
#define container_of(p,t,n) (t*)((p)-&(((t*)0)->n))
再来看看Linux Kernel中的实现。
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
© 2009, liuw. All rights reserved.
我在想((t*)0)->n)成立嘛? 0×0下怎么会有n这个值?
wayne(Quote)
wayne
2 Dec 09 at 08:23
@wayne
这个是C语言里面的一个小技巧。上面是我自己实现的版本,Linux Kernel里面的实现估计会好一点。
一般人印象里面0就是一个“非法地址”,其实不应该这样理解。C语言是很自由的,什么地址做怎么样的解释,完全是程序员个人的自由。注意,是“解释”,我们并不需要这个地址上真的存在一个语义上合法的值。
liuw(Quote)
liuw
2 Dec 09 at 11:14
理解,就和( *(void (*)( ) ) 0)( )一样
wayne(Quote)
wayne
6 Dec 09 at 18:22