(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顯式丟棄一個表達式的值,不然有些編譯器會就此給出警告信息。
相關文章
相關標籤/搜索