linux container_of 的用法
来源:互联网 发布:西安证大财富淘宝贷 编辑:程序博客网 时间:2024/06/10 05:46
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的地址正是结构体内的偏移。
- linux container_of 的用法
- linux container_of 的用法
- 关于linux container_of用法
- 关于Linux container_of用法
- linux container_of的试验
- container_of 的用法及注意事项
- container_of用法
- Linux内核的Container_of机制
- Linux中的container_of的说明
- 一个简要的示例说明Linux内核的container_of 的用法
- container_of linux
- Linux container_of()
- linux内核链表宏 container_of的详细推导
- 【转】Linux内核的container_of宏
- 对linux内核宏container_of的理解
- [Linux 系统编程] container_of 的一点总结
- Linux内核中container_of宏的理解
- 对linux内核宏container_of的理解
- 常量指针与指针常量
- 查杀www.010com.cn netplayone 淘宝 电信 网站刷流量恶意程序
- [算法之美:3.2](递归)电话号码对应的英语单词
- 关于MySQL锁表
- 证书认证原理
- linux container_of 的用法
- 哈工大第二次热身赛1006(悲剧team12 c9q7m9t4)
- 实训开始啦
- JNI
- 求:如何用seo 让自己的网站 排名靠前
- 关于软件raid(mdadm)在重启机器后不会自动运行的问题
- Flex+Java 开发环境部署之一:JDK
- 说明简单工厂模式的作用
- LGame文档及0.2.8版发布预告