#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