Linux系统container of函数内核编程的详细说明,linux内核编程container of()函数介绍( 二 )


#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)这次再看就顺眼了吧(底层为什么是这样我还是不懂 。。。只知道这样确实可以) ,  所以offsetof()的作用就是求我们梦寐以求的size, 并以size_t形式返回(size_t: 无符号整型) 。
(二) 内核编程的严谨性  #define container_of(ptr, type, member) ({\const typeof( ((type *)0)->member ) *__mptr = (ptr);\(type *)( (char *)__mptr - offsetof(type,member) );})    这里我们只看第二行:
const typeof( ((type *)0)->member ) *__mptr = (ptr);  它的作用是什么呢? 其实没什么作用(勿喷勿喷,让我把话说完),但就形式而言 _mptr = ptr,  那为什么要要定义一个一样的变量呢??? 其实这正是内核人员的牛逼之处:如果开发者使用时输入的参数有问题:ptr与member类型不匹配,编译时便会有warnning, 但是如果去掉改行,那个就没有了,而这个警告恰恰是必须的(防止出错有不知道错误在哪里) 。。。这严谨性可以吧
typeof( ((type *)0)->member )   它的作用是获取member的类型仅此而已 。至此基本结束
(三) 总结       container_of(ptr, type,member)函数的实现包括两部分:
           1.  判断ptr 与 member 是否为同意类型
           2.  计算size大小,结构体的起始地址 = (type *)((char *)ptr - size)   (注:强转为该结构体指针)
    现在我们知道container_of()的作用就是通过一个结构变量中一个成员的地址找到这个结构体变量的首地址 。
    container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员 。
到此这篇关于linux内核编程container of()函数的文章就介绍到这了,更多相关linux container of()函数 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
Linux系统container of()函数内核编程的详细说明,linux内核编程container of()函数介绍相关文章的简单说明介绍 。

推荐阅读