Linux内核中的Min和Max函数

转载 2012年03月27日 16:05:03
今天看代码时看到一个有趣的东东,就是linux内核也有min函数,但它的实现很是奇怪,先贴出来:
/*
* 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; })

其他都很平常,但中间(void) (&_x == &_y);比较奇怪,这句干嘛用的的呢?
查了下网发现:
(void) (&_x == &_y)这句话本身都执行程序来讲完全是 div:eq(0) > div:eq(3) > table:eq(2) > tbody:eq(0) > tr:eq(0) > td:eq(0) > div:eq(0) > #content:eq(0) > br:eq(18)" anchorType="previous" jQuery1251853974125="6">一句
废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。

另外为什么要在定义两个局部变量_x,_y,作用体现如下:
如果定义成下面这样:
   #define min(a,b) (((a) < (b)) ? (a) : (b))
  试想:
  min(++a,++b) ==> ((++a)<(++b))?(++a) : (++b)
  是不是就有问题了,传入的参数被加了两次。
定义成上面这样就不会出问题了,呵呵

相关文章推荐

linux内核中的min、max函数

这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面...

linux内核中的min、max函数

这些天为了整理一下前段时间看ldd3时所学的驱动知识,所以就去看了看usb驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面...

Linux内核中是怎么实现min和max函数

Linux内核代码有很多很经典的代码,仔细去看看,可以学到很多知识。今天说说Linux是怎么实现min和max的。max和min函数都是比较常用的,可以用函数,或者利用宏去实现,一般我们会这样去写: ...

LINUX内核中min和max宏的学习

add linux kernel min, max define:include/linux/kernel.h/* * min()/max() macros that also do * strict...

Linux内核源码--min,swap宏定义

Linux3.5的部分宏定义在Linux-3.5/include/linux/kernel.h的头文件中有定义 一: 最大值和最小值相关的宏 [cpp] view ...

【C语言】Linux内核源码--min,swap宏定义

Linux3.5的部分宏定义在linux-3.5/include/linux/kernel.h的头文件中有定义 /* * min()/max()/clamp() macros that also d...

Linux内核参数(如kernel.shmmax)及Oracle相关参数调整(如SGA_MAX_SIZE)

我们一般在Linux 上安装 设置Oracle 数据库 或者在更换或升级硬件的时候都需要配置Linux 系统的核心参数, 然后才是调整Oracle 系统参数 。具体这些参数的实质意义是什么,为什么要...

Linux内核函数

  • 2014-04-04 21:02
  • 1.65MB
  • 下载

max、min、zip函数的用法

源码def max(*args, key=None): # known special case of max """ max(iterable, *[, default=obj, k...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)