跳至主要内容

container_of

Linux常用container_of宏从成员变量提取整个结构体的首地针,这个宏的定义如下:

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

typeof是gcc的一个扩展,用于确定一个变量的类型,有点像C++的RTTI,常用于表达式内的语句,在定义宏时,如果需要临时变量,可以这样做:
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
它可以保证我们定义的变量_a/_b与宏传入的变量a/b类型匹配,而不会产生编译器告警。

因此container_of的第一行就是定义一个与member类型匹配的变量__mptr,赋值后,__mptr为宏参数中的待转换指针,因为只是类型转换,不涉及数据读写,((type*)0)是没有任何副作用的。

第二行用__mptr减去member变量在type中的偏移,这样便可实际访问到ptr相同偏移,也即type的实际首地址了。offsetof有两种定义:

#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif

__compiler_offsetof即__builtin_offsetof,__builtin_offsetof可能是gcc內建的支持(见gcc源码c-parser.c),
从后一种实现方式可以明显看到这一技巧,假定一个从0地址开始的结构体,取其成员member的地址正是结构体内的偏移。

评论

此博客中的热门博文

反转剧

这两天明显感到天气转冷,呱呱的家里也已经下起了大雪,南京则是阴冷潮湿,让人没有了出行的欲望。没想到躲在被子里看反转剧也成了度过寒冬的一剂良药。在PPLive越来越让人失望的时候,PPStream横空出世,虽然广告仍是少不了的主题,但从视频质量和播放连续性上来说都超过PPLive,实为居家必备之良品(由此可见,新事物一定会战胜旧事物......)。韩国的反转剧最近似乎比较流行,称之为反转剧就在于其结果总是让人出乎意料,不合常理,其间又不乏各种搞怪搞笑的镜头,各种当红帅哥美女也一定让DDMM们爱不释手,20~30分钟一集的剧情一改韩剧拖沓的风貌,想看就看,容易切入。 反转剧,今天你看了吗?

低谷

近段时间,小猪的身体不好,连续好几个周末游走于各个医院,两人的心情也坏到了极点。现在的小猪已俨然成为一个药罐子,不再提当年之勇。这个周末又发起烧来,像一滩烂泥似地躺在床上,真是祸不单行。 而我呢,由于前任离职的缘故,现在出奇地忙,每天就像打仗似地,压得人喘不过气来,工作与家庭,真有些夹缝中求生存的感觉,两头都要兼顾,我想这一次我们是真的走到一个低谷了吧。 希望这一切都会过去,一切都能圆满地解决。

Black Hawk Down

ONLY THE DEAD HAVE SEEN THE END OF WAR. PLATO 黑鹰坠落,拍了有好几年了,虽然根据这个事件改编的游戏很早就玩过,电影今天还是第一次看。 电影无疑是血腥的,战争无疑是残酷的。 一开始指挥官就低估了战局,民兵数量如此之多,对比悬殊,再加上作战基本上是巷战,让人防不胜防,空中掩护无法有效地展开。在车队前往坠机地点时,那情景就和游戏里一样,“it's a dead trap”,建筑物窗口,顶层,满是民兵,装甲车炮手目标太明显,如果不是民兵的射击准确度太低,恐怕早就被全部打死了。似乎美国片总是在宣扬一种精神:不能落下一人,在这样的战况下还做出这样的决定,我不清楚这种精神是骨子里的,还是政治上的,然而牺牲的总是战士,有太多不属于我们的战争。 有几个地方印象比较深刻: 最先被RPG炸死的装甲车炮手,下半身已经炸没了,死前的话还是希望告诉女儿他很好,我想对于士兵,要么家是一个太遥远的概念,要么就是最痛心的牵挂了。 在车队通过四处伏击的巷道时,第一辆车正面被RPG击中,驾驶员的眼晴已经瞎了,然而还是要咬着牙踏油门,不能停,在那样的情况下,如果第一辆车停下,整个车队都将被覆灭。 第二架被击落的黑鹰驾驶员Durant被俘后,与Aidid的人有这样的对话: What do you want with me? You have taken hostages. We have you. My government will never negotiate for me. Then perhaps you and I can negotiate, huh? Soldier to soldier. I'm not in charge. Course not. You have the power to kill, but not negotiate. In Somalia, killing is negotiation. Do you really think if you get General Aidid...we will simply put down our weapons...and a...