技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1592|回复: 1
收起左侧

【C语言】分享一则GCC使用经验:(void)(&_x == &_y)

[复制链接]

1060

主题

2443

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
221
威望
348 点
宅币
19512 个
贡献
40290 次
宅之契约
0 份
在线时间
1844 小时
注册时间
2014-1-26
发表于 2015-12-5 15:00:36 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
#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),这是什么意思呢?

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

但是这样也会让GCC输出另一条警告:warning: statement with no effect. 也就是“警告:表达式没有任何效果。”但是我们又不想看到这条无用的警告,因此在(&_x == &_y)这个表达式的左边加一个(void),意为告诉编译器“即使它没用我也要这么写。”这样编译器就不会提示了。真是个巧妙的设计呢!

参考资料:
http://www.crifan.com/order_min_ ... __y_the_meaning_of/

本帖被以下淘专辑推荐:

回复

使用道具 举报

0

主题

41

帖子

45

积分

用户组: 初·技术宅

UID
3351
精华
0
威望
2 点
宅币
0 个
贡献
0 次
宅之契约
0 份
在线时间
0 小时
注册时间
2018-1-14
发表于 2018-1-14 14:58:37 | 显示全部楼层
可以可以!!
回复

使用道具 举报

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-7-13 12:59 , Processed in 0.097274 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表