0xAA55 发表于 2015-12-5 15:00:36

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

#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__macro_definition_void_amp__x__amp__y_the_meaning_of/

7KY6 发表于 2018-1-14 14:58:37

可以可以!!
页: [1]
查看完整版本: 【C语言】分享一则GCC使用经验:(void)(&_x == &_y)