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驱动。不看不知道,一看吓一跳,里面有很多语法我发现用的太好了,不像我们平时那样写代码。里面写的代码真是太好了。然而要理解到里面...
  • snowbabybw
  • snowbabybw
  • 2011年01月06日 16:59
  • 12319

C/C++中的max/min函数宏定义问题

不要轻易修改自带的头文件,写代码一定要规范!
  • zjn21hx
  • zjn21hx
  • 2015年11月12日 22:59
  • 13082

Linux编程中中各种头文件

1.unistd.h 是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数 2.stdlib.h  ...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年06月03日 10:40
  • 4148

【Linux】利用man命令来查看头文件与函数说明

利用Linux-C编程的时候,要查询某一个函数所处的头文件,或者怎么用,不需要某度一下,只需要用man命令+函数名,则能够打印该函数的所有说明,当然这个函数必须是Linux-C本身就有的函数。 如下...
  • yongh701
  • yongh701
  • 2016年12月16日 09:33
  • 1959

Oracle(三) - Oracle关于Max和Min函数的几种写法比较

实验环境: SQL> conn /as sysdba 已连接。 SQL> grant select on dba_objects to scott; 授权成功。 SQL> conn scott/tig...
  • duheaven
  • duheaven
  • 2013年12月10日 22:31
  • 4485

python奇技淫巧——max/min函数的用法

本文以max()为例,对min/max内建函数进行说明 源码 def max(*args, key=None): # known special case of max """ ...
  • IAlexanderI
  • IAlexanderI
  • 2017年04月15日 16:22
  • 1815

linux内核模块头文件之---kernel.h

kernel.h中包含了内核打印函数 printk函数 等
  • kokodudu
  • kokodudu
  • 2013年12月23日 15:11
  • 7102

Linux下的c编程用到的头文件

unistd.h unistd的意思是UnixStandard的意思,里面定义的宏一类的东西都是为了Unix标准服务的(一般来说包括了POSIX的一些常量…… unistd是unix 系统标准头文...
  • qustdjx
  • qustdjx
  • 2012年05月21日 17:42
  • 11128

C语言:min和max头文件

C语言:min和max头文件
  • a_little_snail
  • a_little_snail
  • 2017年07月12日 19:42
  • 2627

GoLang之各种函数的用法

2013-12-27 wcdj 大纲 本文总结GoLang中常用的几种函数方法,主要包括: [0] 首先main是一个没有返回值的函数 [1] 普通函数 [2] 函数返回多个值 [3] 不定参函数 ...
  • delphiwcdj
  • delphiwcdj
  • 2013年12月27日 14:53
  • 7696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux内核中的Min和Max函数
举报原因:
原因补充:

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