博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
typeof, offsetof, container_of宏
阅读量:6466 次
发布时间:2019-06-23

本文共 707 字,大约阅读时间需要 2 分钟。

container_of宏实现如下:

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

首先,container_of的作用是,根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。

那么这里又涉及到 typeof 和 offsetof两个宏。

typeof 是用于得到变量的类型;typeof是GNU C对标准C的扩展。

offsetof 用于得到结构体中某个成员的内部偏移。

offsetof 的宏实现如下:

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

这里将0作为TYPE的起始地址,那么((TYPE *)0) ->MEMBER就是MEMEBER的地址,也就是偏移了。

offsetof和__builtin_offsetof实现相同。

有了typeof 和 offsetof 再来理解container_of 。第一行定义了一个 常量指针 __mptr, 指向的变量类型为member的类型, 值为ptr。

那么__mptr的地址减掉member的内部偏移就可以得到结构体的起始地址。

转载于:https://www.cnblogs.com/Stomach-ache/p/4287616.html

你可能感兴趣的文章
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
[Unity3d]DrawCall优化手记
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
p2:千行代码入门python
查看>>
bzoj1106[POI2007]立方体大作战tet*
查看>>
spring boot configuration annotation processor not found in classpath问题解决
查看>>
Mysql中文字符串提取datetime
查看>>
由中序遍历和后序遍历求前序遍历
查看>>
我学习参考的网址
查看>>
[Processing]点到线段的最小距离
查看>>
考研随笔2
查看>>
乱码的情况
查看>>
虚拟机centos 同一个tomcat、不同端口访问不同的项目
查看>>
在不花一分钱的情况下,如何验证你的创业想法是否可行?《转》
查看>>
Linux/Android 性能优化工具 perf
查看>>
GitHub使用教程、注册与安装
查看>>
<<The C Programming Language>>讀書筆記
查看>>
JS详细入门教程(上)
查看>>