(转)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 的宏定义,

大致意思是:

  1.  typeof(x) _x = (x); typeof(y) _y = (y);
    定义一个和 x 相同类型的变量 _x,定义一个和 y 相同类型的_y,并将 x和y的值分别赋值给他们。

  2. (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
posted @ 2017-05-29 13:51  懒猫的新窝  阅读(814)  评论(0)    收藏  举报