contain_of宏定义
2018-06-18 03:56:26来源:未知 阅读 ()
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 =%d\n",test_struct->num); 18 printf("test_struct->ch =%c\n",test_struct->ch); 19 printf("test_struct->ch =%f\n",test_struct->f1); 20 return 0; 21 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:新手的疑惑,动力取决于三点
下一篇:内存知识的积累
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ 类 2020-06-02
- 二叉搜索树_BST 2020-05-30
- C++ 单定义规则 2020-05-10
- C++ 函数模板 2020-04-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash