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)

相关推荐

  • 治经的意思,孤岂欲卿治经为博士邪

    技术治经的意思,孤岂欲卿治经为博士邪解答:我难道想要你研究儒家经典治经的意思,成为学官吗?扩展资料:此段落选自《孙权劝学》,“《孙权劝学》”选自“《自治通鉴》”。这是北宋历史学家和政治家司马光的叙述。三国时期,吴军大将吕

    生活 2021年10月28日
  • 哈尼族的传统节日风俗,哈尼族有哪些节日和风俗习惯

    技术哈尼族的传统节日风俗,哈尼族有哪些节日和风俗习惯居住习俗:哈尼族多居住在半山腰,依山势建立村寨。2.服装习俗:哈尼族一般用自己染织的藏青色土布做衣服。男人多穿对襟上衣和长裤,用黑布或白布裹头。妇女多穿右襟无领上衣,下

    生活 2021年10月21日
  • 火柴英文,卖火柴的小女孩英文原版结局

    技术火柴英文,卖火柴的小女孩英文原版结局Once upon a time a little girl tried to make a living by selling matches in the street. Th

    生活 2021年10月26日
  • 怎么部署Silverlight及Web Service

    技术怎么部署Silverlight及Web Service小编给大家分享一下怎么部署Silverlight及Web Service,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一直通过Visual St

    攻略 2021年11月24日
  • 鲫鱼的做法大全家常菜,鲫鱼怎么做好吃

    技术鲫鱼的做法大全家常菜,鲫鱼怎么做好吃鲫鱼豆腐汤鲫鱼的做法大全家常菜:材料:
    鲫鱼1条、豆腐1盒、姜3片、葱3段、油、盐、胡椒、料酒、鸡精做法:
    1、鲫鱼开膛去内脏,去鳞去鳃(鱼档工作人员完成),洗净,抹干,用盐和

    生活 2021年10月20日
  • 骠勇读音,brothers怎么读

    技术骠勇读音,brothers怎么读brother的读音为英 [ˈbrʌðə(r)] 美 [ˈbrʌðɚ] 骠勇读音。具体释义如下: brother 英 [ˈbrʌðə(r)] 美 [ˈbrʌðɚ] 1、名词 n.兄弟;

    生活 2021年10月29日