(转)linux中对 min 的宏定义的解释
#include <stdio.h> #define min(x,y) ({typeof(x) _x = (x); typeof(y) _y = (y);(void) (&_x == &_y); _x<_y ? _x : _y;}) #define min_replace(x,y) ({x < y ? x : y;}) int main() { int x=1; int y=2; int result = min(x++,y); printf("替换后的结果为: %d\n",result); int x1=1; int y1=2; int result1 = min_replace(x1++,y1); printf("替换之后的运行结果为: %d\n",result1); return ; }
({typeof(x) _x = (x); typeof(y) _y = (y);(void) (&_x == &_y); _x<_y ? _x : _y;})
这一段不明白,最后的 _x<_y ? _x : _y; 知道是三目运算符
而前面的 typeof(x) _x = (x); typeof(y) _y = (y);(void) (&_x == &_y); 不理解
这是linux中对 min 的宏定义,
大致意思是:
-
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
原文地址:https://zhidao.baidu.com/question/519793454464272005.html
浙公网安备 33010602011771号