c语言宏定义函数怎么用(c语言continue函数使用方法)

技术C语言宏函数container of()怎么使用本篇内容主要讲解“C语言宏函数container of()怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言宏函

本文主要讲解“如何使用C语言宏函数containerof()”,感兴趣的朋友不妨看一下。本文介绍的方法简单、快速、实用。让边肖带你学习“如何使用C语言宏函数containerof()”!

在linux内核编程中,我们经常会看到一个宏函数container_of(ptr,type,member),但是当你追溯源代码的时候,像我们这样的普通人会绝望(这是什么堆?函数也可以这样定义?为什么还是0?嘿,算了,我们放弃吧。)。这就是内核大佬牛逼的地方。仅仅两行代码就让我们怀疑人生。一切都需要一个过程。慢慢来。

C语言宏函数containerof()怎么使用

其实原理很简单:结构类型成员的地址ptr已知,结构类型的起始地址求解。

type=ptr-size的起始地址(这里需要转换为char *因为是单位字节)。

至此,功能已经完成了,不是很简单吗?其实不是。这里没有提到如何计算大小,但是就是这里让我们晕头转向。

好,让我们从容器函数的原型开始:

#definecontainer_of(ptr,类型,成员)({\

const type of(((type *)0)-成员)* _ _ mptr=(ptr);\

(type *)((char *)_ _ mptr-offset of(type,member));})其次,偏置函数的原型:

#定义(type,member)((size _ t)((type *)0)-member的偏移量怎么样,是不是很酷?好了,让我们开始揭开面纱:

00-1010让事实说话:

# includestdio.h

结构测试

{

chari

intj

恰克;

};

intmain()

{

structtesttemp

printf('temp=%p\n ',temp);

printf('temp.k=%p\n ',temp . k);

printf('((struct test *)0)-k=% d \ n ',((int)((struct test *)0)-k));

}编译并运行,可以得到以下结果:

temp=0xbf9815b4

temp.k=0xbf9815bc

((structtest*)0)-k=8什么意思?看,自定义结构有三个变量:I、J和k,由于字节对齐的要求,结构的大小为4字节* 3=12字节。而((struct test *)0)-k的作用是求从k到结构temp起始地址的字节数(也就是我们的大小)。这里,0被强制转换为struct test *类型,其作用是作为指向结构起始地址的指针,即作为指向结构起始地址的指针,即作为指向结构起始地址的指针,而((struct test *)0)-k的作用是求从k到起始指针的字节数。其实就是求相对地址,起始地址是0,那么k的值就是大小(注意:因为需要整数,所以打印的时候有一个int强转换),这样就可以找到我们需要的大小。嗯,我不小心完成了offsetof()函数的功能:

#定义(type,member)的偏移量((size _ t) ((type *) 0)-member)这次会比较顺眼(我还是不明白底层为什么会这样。只知道这是真的有可能的),所以offsetof()的功能是找到我们梦寐以求的大小,并将其作为size_t (size_t:无符号整数)返回。

(一)0 指针的使用 (自己给的名字,不知有木问题)

# definecontainer _ of(ptr,类型,成员)({\

const type of(((type *)0)-成员)* _ _ mptr=(ptr);\

(type *)((char *)_ _ mptr-offset of(type,member));})这里我们只看第二行:

const type of(((type *)0)-成员)* _ _ mptr=(ptr);它的功能是什么?其实没有用(不喷,不喷,让我说完),但是就form _mptr=ptr来说,那我们为什么要定义同一个变量呢?其实这正是内核人员牛逼的地方:如果开发人员在使用时输入的参数有问题:ptr与成员类型不匹配,编译时会有警告,但是如果去掉了职业的变化,就不会有警告了,这个警告只是必要的(为了防止错误,不知道错误在哪里)。这种严密性可以吗?

type(((type *)0)-成员)它的功能就是获取成员的类型,仅此而已。

至此,相信大家对“如何使用C语言宏函数containerof()”有了更深的理解,下面就来练习一下吧!这是网站。更多相关内容,可以去相关渠道查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153088.html

(0)

相关推荐

  • apacheflink多个漏洞分析(apacheflink目录遍历漏洞修复)

    技术Apache Flink 目录遍历漏洞是怎样的本篇文章给大家分享的是有关Apache Flink 目录遍历漏洞是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一

    攻略 2021年12月21日
  • Python编程基础的字典怎么使用

    技术Python编程基础的字典怎么使用本篇内容介绍了“Python编程基础的字典怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,

    攻略 2021年12月10日
  • Promise的介绍及基本用法是什么

    技术Promise的介绍及基本用法是什么这期内容当中小编将会给大家带来有关Promise的介绍及基本用法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Promise是ES6引入的

    攻略 2021年10月22日
  • 分析PostgreSQL DBA的pgAdmin情况

    技术分析PostgreSQL DBA的pgAdmin情况本篇内容介绍了“分析PostgreSQL DBA的pgAdmin情况”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如

    攻略 2021年11月5日
  • Window下如何安装Kerberos客户端及浏览器配置

    技术Window下如何安装Kerberos客户端及浏览器配置小编给大家分享一下Window下如何安装Kerberos客户端及浏览器配置,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后

    攻略 2021年11月19日
  • 怎么解决Maven版本不一致问题

    技术怎么解决Maven版本不一致问题这篇文章主要介绍“怎么解决Maven版本不一致问题”,在日常操作中,相信很多人在怎么解决Maven版本不一致问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

    攻略 2021年11月16日