免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4371 | 回复: 11
打印 上一主题 下一主题

请教内核的一个宏定义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-30 14:18 |只看该作者 |倒序浏览
#define min(x,y) ({ \
        typeof(x) _x = (x);        \
        typeof(y) _y = (y);        \
        (void) (&_x == &_y);        \
        _x < _y ? _x : _y; })

在看内核代码时,看到一个这样的宏,实在是不懂(void) (&_x == &_y);这句的意义。请高手指导,谢谢!

论坛徽章:
0
2 [报告]
发表于 2011-07-30 15:56 |只看该作者
看了一下汇编发现加了这一句后用寄存器比较,对比执行效率也变高了

论坛徽章:
0
3 [报告]
发表于 2011-07-31 12:04 |只看该作者
没意义,这句,如果x和y类型不同,2个指针赋值会有警告

仅此而已

论坛徽章:
0
4 [报告]
发表于 2011-07-31 14:08 |只看该作者
没意义,这句,如果x和y类型不同,2个指针赋值会有警告

仅此而已
tinysniper 发表于 2011-07-31 12:04



    LZ说的跟你说的不是一回事吧。赋值那两句显然是你说的那意思,但是后面比较那句应该是为了把两个都取到寄存器中再进行比较,加快效率。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2011-07-31 20:59 |只看该作者
回复 4# lengyuex


    我在书上也看过确实如三楼的解释, 哪本书忘记了。。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
6 [报告]
发表于 2011-07-31 22:02 |只看该作者
3 楼正解,就是为了判断x与y是不是同一个类型。

论坛徽章:
0
7 [报告]
发表于 2011-07-31 23:13 |只看该作者
3 楼正解,就是为了判断x与y是不是同一个类型。
liujunwei1234 发表于 2011-07-31 22:02



    应该不只有这一种作用吧?你用汇编比较一下看看?

论坛徽章:
0
8 [报告]
发表于 2011-08-01 09:30 |只看该作者
非常感谢!受教了

论坛徽章:
0
9 [报告]
发表于 2011-08-02 00:06 |只看该作者
本帖最后由 omycle 于 2011-08-02 00:08 编辑

回复 3# tinysniper


    没意义,这句,如果x和y类型不同,2个指针赋值会有警告

仅此而已

人家不是赋值啊~,那个是“==”

这个问题,之前已经被人问过了:
http://bbs.chinaunix.net/viewthread.php?tid=1933477

论坛徽章:
0
10 [报告]
发表于 2011-08-02 08:43 |只看该作者
google一下发现不是楼上所说,原话粘贴是
关于其中的:

(void) (&_x == &_y);

很是疑惑,表面看起来,这句话,好像不起作用,算是一句废话,所以去找了一下别人的解释,才大概搞懂是啥意思。

首先,我们此处想要实现的目的是,在计算两个数的最小值之前,希望去判断一下两个值的类型是否一致,而由于C语言本身不支持我们去做类似于这样的操作typeof(_x)==typeof(_y),所以在此,通过故意判断他们2个的地址指针是否相等,而显然&_x,即x的地址,是不可能等于&_y的,但是这句话(void) (&_x == &_y);使得,如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,则会引起编译器产生一个编译警告,提示你这两个值的类型不同。

比如,如果你编译下面这段代码:

int x = 2;
char y = 3;
int m;
m = min(x,y);

编译的时候,经过预处理后,就会有这样的判断操作:

int * == char *;

因此编译器就会提示你:

warning: comparison of distinct pointer types lacks a cast

所以,这个宏的巧妙之处就在于此。

所以,总结起来就是:

(void) (&_x == &_y); 用于判断输入的两个值的类型是否是一致的。如果不一致,那么编译器就会做出如下警告:warning: comparison of distinct pointer types lacks a cast
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP