Linux types.h頭文件min宏

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章