linux内核中的min、max函数
发布日期:2021-10-16 12:05:15
浏览次数:11
分类:技术文章
本文共 4789 字,大约阅读时间需要 15 分钟。
这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面的东西还是不容易的。
今天看见usb_stor_access_xfer_buf函数的时候,想看看里面的min 函数是不是按照我们写的那么写。但是一看傻啦,还有些东东我还没用过,于是赶紧google一下,那到底下面代码是什么样的呢?大家可以到、include/linux/kernel.h 里面去找。不相找事吧,那好我贴在这里。
/* * min()/max() macros that also do * strict type-checking.. See the * "unnecessary" pointer comparison. */ #define min(x,y) ({ / typeof(x) _x = (x); / typeof(y) _y = (y); / (void) (&_x == &_y); / _x < _y ? _x : _y; })
#define max(x,y) ({ / typeof(x) _x = (x); / typeof(y) _y = (y); / (void) (&_x == &_y); / _x > _y ? _x : _y; })
当我google 了以后发现很多人都看过这个函数,看来我是out了。这都是在大学欠下的账啊,正所谓:“出来混,迟早都要还的”,还好今天就开始学了。
下面看一位兄弟的理解,他讲的很好。
min宏定义探究
| |
Min和Max宏: /* * min()/max() macros that also do * strict type-checking.. See the * "unnecessary" pointer comparison. */ #define min(x,y) ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x < _y ? _x : _y; }) #define max(x,y) ({ typeof(x) _x = (x); typeof(y) _y = (y); (void) (&_x == &_y); _x > _y ? _x : _y; }) /* * ..and if you can't take the strict * types, you can specify one yourself. * * Or not use min/max at all, of course. */ #define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) #define max_t(type,x,y) ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; }) 不是感觉跟我们用的有些不一样啊: (void) (&_x == &_y); (void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。 由于内核是很多开发着一起开发的,其中还有一些其他的实现,就跟我们平常用的一样: #define min(a,b) (((a) < (b)) ? (a) : (b)) 试想: min(++a,++b) ==> ((++a)<(++b))?(++a):(++b) 是不是就有问题了,传入的参数被加了两次。 |
好了,我就是把别人的东西收集了一下,到现在你明白里面的GCC中的({statement list})的扩展了吗,应该基本可以理解了。接着努力,路漫漫其修远兮,、、、、、
转载地址:https://blog.csdn.net/snowbabybw/article/details/6120780 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月23日 12时54分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
arm-linux-gcc下载与安装
2021-07-01
嵌入式linux自动更新网络时间NTP移植
2021-07-01
linux gettimeofday 时间转换成标准格式
2021-07-01
arm5718双网卡配置
2021-07-01
5718支持两路can调试方法
2021-07-01
I2Cdetect,i2cdump,i2cset,i2cget 的使用方法
2021-07-01
在ARM-Linux上安装FTP服务
2021-07-01
systemctl 启动/关闭/启用/禁用服务
2021-07-01
Linux服务中的 printf 输出 重定向输出 无法打印问题分析以及解决方法
2021-07-01
CAN矩阵、CAN网络、DBC、MDF关系
2021-07-01
CAN网络dbc格式
2021-07-01
基于设备树的arm571x平台的SPI总线的扩展添加
2021-07-01
基于arm571x的Linux CAN通讯
2021-07-01
arm5718的linux can操作命令
2021-07-01
TI DSP TMS320C66x学习笔记之算法运算时间测量(五)
2021-07-01
TI 实时操作系统SYS/BIOS使用总结
2021-07-01
Windows下的ftp下载脚本
2021-07-01
vs2012 Office2013 读写excel文件
2021-07-01
VS2005+WINDDK+Driver Studio 3.2个人总结
2021-07-01