(void)(&x == &y)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/erazy0/archive/2010/03/31/5437910.aspx spa

其余都很日常,但中间(void) (&_x == &_y);比较奇怪,这句干吗用的的呢? .net

查了下网发现:

(void) (&_x == &_y)这句话自己从执行程序来说彻底是一句废话,它的做用在于,自己咱们没法作这样的操做typeof(_x)==typeof(_y),因此 故意判断他们2个的地址指针是否相等,显然是不可能相等,可是若是_x和_y的类型不同,其指针类型也会不同,2个不同的指针类型进行比较操做,会 抛出一个编译警告。也就是说char *p; int *q; 而后p==q;,这个判断由于一个是char*一个是int*,会在编译时产生一个warning。巧妙就巧妙在这里。 指针

http://blog.csdn.net/litao0976/article/details/10416931 blog


#define min(x,y) ({ \
        typeof(x) _x = (x);        \
        typeof(y) _y = (y);        \
        (void) (&_x == &_y);                \
        _x < _y ? _x : _y; })

...


写这个宏的人考虑了以下几个问题:
一、如何避免带参宏的反作用。
二、若是两个入参类型不一样,做者不能保证在这种状况下获得预期的比较结果,因而以一种编译器可以识别的方式“制造”出警告信息。相似于#error的用法。
三、经过void显式丢弃一个表达式的值,不然有些编译器会就此给出警告信息。
相关文章
相关标签/搜索