两个重要的宏 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有问题,后头电脑弄好了再来实验下,
网站: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有问题,后头电脑弄好了再来实验下,
相关文章推荐
- BIO,NIO,AIO
- 成都某经济学院服务器raid卡损坏数据恢复成功
- TurboMail邮件系统再次通过涉密软件认证
- Deep Reinforcement Learning — Papers (2)
- Unable to obtain debug bridge
- 常用RAID简介及软RAID的实现
- UVA 514——Rails
- AIDL简介
- 严苛模式解决NetworkOnMainThreadException
- 英文歌曲:Right Here Waiting(此情可待)
- CF651B-Beautiful Paintings
- ABP源码分析七:Setting 以及 Mail
- POJ-1273 Drainage Ditches(最大流)
- 模板(双向链表与队列)
- 《leetCode》:Contains Duplicate
- RAID各级别的特性
- RAID各级别的特性
- LeetCode 219. Contains Duplicate II
- 《leetCode》:Contains Duplicate II
- 1014. Waiting in Line (30)