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)

相关推荐

  • Hibernate应用开发遇到的问题有哪些

    技术Hibernate应用开发遇到的问题有哪些这篇文章主要讲解了“Hibernate应用开发遇到的问题有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernat

    攻略 2021年12月4日
  • Pythond类在函数中的编程方法是什么

    技术Pythond类在函数中的编程方法是什么Pythond类在函数中的编程方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Pythond类如何进行相

    攻略 2021年10月28日
  • servletservice方法的参数(如何将service注入到servlet)

    技术servlet.service()方法怎么调用这篇文章主要介绍“servlet.service()方法怎么调用”,在日常操作中,相信很多人在servlet.service()方法怎么调用问题上存在疑惑,小编查阅了各式

    攻略 2021年12月24日
  • mybatis的sql语句如何防止注入(mybatis的sql语句如何预防注入)

    技术mybatis使用${}时sql注入的问题怎么解决这篇文章给大家介绍mybatis使用${}时sql注入的问题怎么解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mybatis使用${}时sq

    攻略 2021年12月16日
  • Spring Cloud Gateway的断路器(CircuitBreaker)功能

    技术Spring Cloud Gateway的断路器(CircuitBreaker)功能 Spring Cloud Gateway的断路器(CircuitBreaker)功能欢迎访问我的GitHub
    h

    礼包 2021年11月19日
  • 会意字大全,象形、指事、会意、形声字各二十个

    技术会意字大全,象形、指事、会意、形声字各二十个象形字:雨会意字大全、元、木、眉、左、右、门、龟、车、月、龟、马、鱼、日、门、木、山、手、羊、草、鸟、虫、川、耳、口、人、田、水、火 指事字:上、一、二、下、丨、丩、爻、元

    2021年10月21日