学习container_of
来源:互联网 发布:ztree导出json 编辑:程序博客网 时间:2024/06/08 00:18
#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) );})
理解这段宏必须先理解在C语音中({})代表什么意思,The GNU C Reference Manual中有这么一段例子:
({ int y = function (); int z; if (y > 0) z = y; else z = - y; z; })其值为z,即最后一个表达式的值,并且The GNU C Reference Manual中提到了当知道a,b类型的情况下(通过typeof()函数可以知道,这里假设为int)
#define maxint(a,b) \ ({int _a = (a), _b = (b); _a > _b ? _a : _b; })这种定义方式要比
#define max(a,b) ((a) > (b) ? (a) : (b))这种方式要好,因为在 #define max(a,b) ((a) > (b) ? (a) : (b))中,a,b都计算了两次,不清楚的话,假设一下传入的是x++等类型的就知道了。
好了,解释到这里,最前那段宏定义也自然就明白了,typeof返回的就是其包含的类型,const typeof( ((type *)0)->member ) *__mptr = (ptr); 定义了一个数据结构成员类型的变量指针, (char *)__mptr - offsetof(type,member) 意思就是成员地址值减去成员偏移量(转成char*指针是利用了指针加减运算),自然就是结构体第一个成员所在的地址了,也就是结构体变量本身的地址了,因此就可以求得哪个变量包含了该成员。
0 0
- container_of学习
- 学习container_of
- container_of学习
- container_of宏用法学习
- container_of
- container_of
- container_of
- container_of
- container_of()
- container_of()
- container_of
- container_of
- container_of()
- container_of
- container_of()
- container_of
- container_of
- container_of()
- 【LeetCode-190】 Reverse Bits(C++)
- 剑指offer10--O(1)的时间实现单链表节点的删除
- Android RxJava+Retrofit 一次(合并)请求多个接口
- c++关键字:(三)static
- UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
- 学习container_of
- MySQL入门——修改数据表5:给指定表的指定字段添加外键约束
- scp命令
- 关系映射文件***.hbm.xml详解
- XML Schema
- java之强、软、弱、虚四大引用
- [五年困惑] 从数学到计算机 从莱布尼兹到冯诺依曼 从数理逻辑到算法分析
- UEFI+GPT引导实践篇 (UEFI引导安装64位Win7/Win8)
- 专题三1016