代做毕业设计的网站广告联盟看广告赚钱
news/
2025/9/29 22:42:26/
文章来源:
代做毕业设计的网站,广告联盟看广告赚钱,wordpress 分类目录 关键词,网站模板购买 优帮云1.container_of宏
1 Container_of在Linux内核中是一个常用的宏#xff0c;用于从包含在某个结构中的指针获得结构本身的指针#xff0c;通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。 2接口#xff1a; container_of(ptr, type, …1.container_of宏
1 Container_of在Linux内核中是一个常用的宏用于从包含在某个结构中的指针获得结构本身的指针通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。 2接口 container_of(ptr, type, member) ptr:表示结构体中member的地址 type:表示结构体类型 member:表示结构体中的成员 通过ptr的地址可以返回结构体的首地址 3 container_of的实现 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)-member ) *__mptr (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 其实它的语法很简单只是一些指针的灵活应用它分两步 第一步首先定义一个临时的数据类型通过typeof( ((type *)0)-member )获得与ptr相同的指针变量__mptr然后用它来保存ptr的值。 说明typeof是GNU C对标准C的扩展它的作用是根据变量获取变量的类型《typeof关键字在linux 内核中很常见》 第二步用(char *)__mptr减去member在结构体中的偏移量得到的值就是整个结构体变量的首地址整个宏的返回值就是这个首地址。 关于offsetof的用法可参见offsetof宏的使用。
2. 举例来说明container_of的使用
1正确示例:
#include stdio.h #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) );}) struct test_struct { int num; char ch; float f1; }; int main(void) { struct test_struct *test_struct; struct test_struct init_struct {12,a,12.3}; char *ptr_ch init_struct.ch; test_struct container_of(ptr_ch,struct test_struct,ch); printf(test_struct-num %d\n,test_struct-num); printf(test_struct-ch %c\n,test_struct-ch); printf(test_struct-ch %f\n,test_struct-f1); return 0; } 执行结果 jibojibo-VirtualBox:~/cv_work/work/list/container_of $ ./main test_struct-num 12 test_struct-ch a test_struct-ch 12.300000
2错误示例 #include stdio.h #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) );}) struct test_struct { int num; char ch; float f1; }; int main(void) { struct test_struct *test_struct; char real_ch A; char *ptr_ch real_ch; test_struct container_of(ptr_ch,struct test_struct,ch); printf(test_struct-num %d\n,test_struct-num); printf(test_struct-ch %c\n,test_struct-ch); printf(test_struct-ch %f\n,test_struct-f1); return 0; } 执行结果为: jibojibo-VirtualBox:~/cv_work/work/list/container_of1 $ ./main test_struct-num 0 test_struct-ch A test_struct-ch 0.000000 注意由于这里并没有使用一个具体的结构体变量所以成员num和f1的值是不确定的。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922311.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!