Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230240
  • 博文数量: 77
  • 博客积分: 80
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-06 17:15
文章分类
文章存档

2013年(4)

2012年(73)

分类: LINUX

2013-02-15 11:38:37

原文地址:(void) (&_x == &_y) 作者:luoyan_xy


  1. #define min(x, y) (( \
  2. const typeof(x) _x = (x); \
  3. const typeof(y) _y = (y); \
  4. (void) (&_x == &_y); \
  5. _x < _y ? _x : _y; ))

 在内核中的min函数的实现方式如上代码所示,其中比较令人疑惑的一句代码在地4行
 (void) (&_x == &_y)
 第一眼看上去貌似在判断两个参数的类型是否相等,但其实却是在判断两种类型的地址。。

 那么,这句话到底是什么意思呢?
 借用论坛里一个哥们的回答:
 
(void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。

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