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)

相关推荐

  • 怎么设置vivado中ip核的位置(vivado怎么打开查看端口的窗口)

    技术Vivado中IP是如何控制端口的可见与不可见Vivado中IP是如何控制端口的可见与不可见,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。测试平台Viv

    攻略 2021年12月22日
  • Nginx 项目部署

    技术Nginx 项目部署 Nginx 项目部署1. Window 本地部署
    1.1 下载安装官方地址https://nginx.org/其中包含很多nginx版本,大致可以分为:Mainline ver

    礼包 2021年10月28日
  • 设定Oracle用户名密码的规则有哪些

    技术设定Oracle用户名密码的规则有哪些这篇文章主要讲解了“设定Oracle用户名密码的规则有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设定Oracle用户名密

    攻略 2021年11月5日
  • rabbitmq如何确保消息不丢失 chengtian

    技术rabbitmq如何确保消息不丢失 chengtian rabbitmq如何确保消息不丢失 chengtian上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛

    礼包 2021年12月21日
  • 怎样使用HLAscan进行HLA分型

    技术怎样使用HLAscan进行HLA分型这篇文章将为大家详细讲解有关怎样使用HLAscan进行HLA分型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。HLAScan是由韩

    攻略 2021年11月10日
  • 古风古韵的男生名字,求几个好听的古代男生的名字

    技术古风古韵的男生名字,求几个好听的古代男生的名字比如:简玉珩,季舒玄,容云鹤,莫习凛,阮灏君,傅凌天,柯孜墨,楚夫晏,白黎轩,苏兼默古风古韵的男生名字。这些名字富有诗意有非常的好听,关键是一看就是富有诗书底蕴的人家才会

    生活 2021年10月29日