免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8369 | 回复: 10

如下的宏定义中(void) (&_x == &_y);是怎么做到判断类型的? [复制链接]

论坛徽章:
0
发表于 2010-04-05 02:17 |显示全部楼层
  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; ))
复制代码


如题的提问 ,解释一下啊,不胜感激!

论坛徽章:
0
发表于 2010-04-05 11:13 |显示全部楼层
(void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typeof(_x)==typeof(_y),所以故意判断他们2个的地址指针是否相等,显然是不可能相等,但是如果_x和_y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告。也就是说char *p; int *q; 然后p==q;,这个判断因为一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。

论坛徽章:
0
发表于 2010-04-05 12:01 |显示全部楼层
(void) (&_x == &_y)这句话本身都执行程序来讲完全是一句废话,它的作用在于,本身我们无法做这样的操作typ ...
ubuntuer 发表于 2010-04-05 11:13



   谢谢了,没想到这么多

论坛徽章:
0
发表于 2010-06-05 23:39 |显示全部楼层
弱弱的问,为什么要再新定义 _x, _y两个变量呢
const typeof(x) _x = (x); \
const typeof(y) _y = (y); \

而不是直接

void ( &x == &y )
x < y ? x: y

论坛徽章:
0
发表于 2010-06-07 19:22 |显示全部楼层
x,y可能是表达式

论坛徽章:
0
发表于 2010-06-08 21:52 |显示全部楼层
本帖最后由 magicboatrocket 于 2010-06-08 21:56 编辑

哈,正解,x,y 极有可能是表达式的情况,我怎么没想到

小小宏,大知识

论坛徽章:
0
发表于 2010-06-09 13:38 |显示全部楼层
{:3_195:}

论坛徽章:
0
发表于 2010-06-09 22:18 |显示全部楼层
受教了!

论坛徽章:
0
发表于 2011-08-25 09:41 |显示全部楼层
本帖最后由 日方君羊 于 2011-08-25 09:43 编辑
弱弱的问,为什么要再新定义 _x, _y两个变量呢
const typeof(x) _x = (x); \
const typeof(y) _y = (y);  ...
magicboatrocket 发表于 2010-06-05 23:39



    如果x为i++,y为j++的话,就会在最后一句判断的时候增加两次!

论坛徽章:
0
发表于 2012-03-16 16:13 |显示全部楼层
确实学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP