Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325237
  • 博文数量: 81
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 17:38
文章分类

全部博文(81)

文章存档

2016年(4)

2015年(11)

2014年(16)

2013年(37)

2012年(11)

2011年(2)

我的朋友

分类: C/C++

2012-05-19 22:34:14

Linux内核中的Min和Max函数
今天看代码时看到一个有趣的东东,就是linux内核也有min函数,但它的实现很是奇怪,先贴出来:

点击(此处)折叠或打开

  1. /*
  2.  * min()/max()/clamp() macros that also do
  3.  * strict type-checking.. See the
  4.  * "unnecessary" pointer comparison.
  5.  */
  6. #define min(x, y) ({                \
  7.     typeof(x) _min1 = (x);            \
  8.     typeof(y) _min2 = (y);            \
  9.     (void) (&_min1 == &_min2);        \
  10.     _min1 < _min2 ? _min1 : _min2; })

  11. #define max(x, y) ({                \
  12.     typeof(x) _max1 = (x);            \
  13.     typeof(y) _max2 = (y);            \
  14.     (void) (&_max1 == &_max2);        \
  15.     _max1 > _max2 ? _max1 : _max2; })
其他都很平常,但中间(void) (&_x == &_y);比较奇怪,这句干嘛用的的呢?
查了下网发现:
(void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作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)
  是不是就有问题了,传入的参数被加了两次。
定义成上面这样就不会出问题了,呵呵


阅读(947) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~