#define min(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
typeof(x) _x = (x); typeof(y) _y = (y);定义一个和 x 相同类型的变量 _x,定义一个和 y 相同类型的_y,并将 x和y的值分别赋值给他们。
(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