contain_of宏定义
时间:2022-05-03
本文章向大家介绍contain_of宏定义,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
实现方式:
container_of(ptr, type, member) ;
其实它的语法很简单,只是一些指针的灵活应用,它分两步:
第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member )获得)与ptr相同的指针变量__mptr,然后用它来保存ptr的值。
第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。
其中的语法难点就是如何得出成员相对结构体的偏移量?
通过例子说明,如清单1:
1 #include <stdio.h>
2 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
3 #define container_of(ptr, type, member) ({
4 const typeof( ((type *)0)->member ) *__mptr = (ptr);
5 (type *)( (char *)__mptr - offsetof(type,member) );})
6 struct test_struct {
7 int num;
8 char ch;
9 float f1;
10 };
11 int main(void)
12 {
13 struct test_struct *test_struct;
14 struct test_struct init_struct ={12,'a',12.3};
15 char *ptr_ch = &init_struct.ch;
16 test_struct = container_of(ptr_ch,struct test_struct,ch);
17 printf("test_struct->num =%dn",test_struct->num);
18 printf("test_struct->ch =%cn",test_struct->ch);
19 printf("test_struct->ch =%fn",test_struct->f1);
20 return 0;
21 }
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- 利用Reflector把"闭包"看清楚
- CSS伪类的三种写法
- 吴晓斌:"吃鸡"游戏全球多地部署架构分析
- silverlight + wcf(json格式) + sqlserver存储过程分页
- 联众收购多家公司 多枚域名齐助阵
- Android AlertDialog去除黑边白边自定义布局(转)
- “超自然”域名近139万易主
- 服务器磁盘监控脚本分享(含报警邮件)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法