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)

相关推荐

  • 如何深入理解Java设计模式的迭代器模式

    技术如何深入理解Java设计模式的迭代器模式如何深入理解Java设计模式的迭代器模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是

    攻略 2021年11月5日
  • 怎么理解Vue的生命周期及钩子函数

    技术怎么理解Vue的生命周期及钩子函数本篇内容介绍了“怎么理解Vue的生命周期及钩子函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,

    攻略 2021年11月1日
  • Bytom中Dapp Demo合同交易的提交方式是什么?

    技术Bytom中Dapp Demo合约交易的提交方法是什么这篇文章主要讲解了“Bytom中Dapp Demo合约交易的提交方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究

    攻略 2021年12月20日
  • go语言怎么创建websocket服务(golang怎么并发聊天服务器)

    技术GO使用socket和channel怎么实现简单控制台聊天室今天就跟大家聊聊有关GO使用socket和channel怎么实现简单控制台聊天室,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大

    攻略 2021年12月20日
  • mac初体验-安装MySQL

    技术mac初体验-安装MySQL mac初体验-安装MySQL新的工作环境,统一使用的是mac笔记本,macOS初体验,安装环境第一步。
    安装MySQL
    官网选择合适的版本下载,下载地址:https:/

    礼包 2021年11月14日
  • Linux中执行一个mv命令后悔了怎么办

    技术Linux中执行一个mv命令后悔了怎么办这篇文章给大家分享的是有关Linux中执行一个mv命令后悔了怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。翻车现场由于今天在安装完node之后

    攻略 2021年11月20日