您的位置:首页 > 大数据 > 人工智能

两个重要的宏 offsetof 和 container_of

2016-03-21 02:09 316 查看
《朱老师物联网大讲堂》学习笔记

网站:www.zhulaoshi.org

是C高级4.5.11的内容,觉得还是不要讲解的好,这样你光看这个宏,看你理解的了不,

#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

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

这个宏的作用,是通过结构体中某个元素的指针,反推出整个结构体的指针,

其中typeof这个关键字用的很少,要特别说一下,typeof(a)是通过变量a得到a的类型,

因为这个宏比较长,我帮你拆一下,你看就会轻松许多,

第一行是宏的原型,container_of(ptr, type, member)

第二行,相当于定义了一个指针,指针的类型通过typeof来获得的,这里我感觉,我还有一点没理解透,

第三行,结构体元素的指针,减去,元素相对于结构体的偏移量,就得到了结构体整体的偏移量,最后需要类型转换一下,

ps:我觉得第三行的char *换成int *什么的也是没问题的,主要是地址的值相减,不过我的vs有问题,后头电脑弄好了再来实验下,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: