小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【整理】min()的宏定義中的(void) (&_x == &_y)的含義

 風(fēng)雨篤行 2012-03-22

近日無(wú)意間發(fā)現(xiàn),關(guān)于常見(jiàn)的min的宏定義,在Linux中是這樣的:

/*
* min()/max()/clamp() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x, y) ({     \
typeof(x) _x = (x);    \
typeof(y) _y = (y);    \
(void) (&_x == &_y);   \
_x < _y ? _x : _y; })

關(guān)于其中的:

(void) (&_x == &_y);

很是疑惑,表面看起來(lái),這句話,好像不起作用,算是一句廢話,所以去找了一下別人的解釋,才大概搞懂是啥意思。

首先,我們此處想要實(shí)現(xiàn)的目的是,在計(jì)算兩個(gè)數(shù)的最小值之前,希望去判斷一下兩個(gè)值的類型是否一致,而由于C語(yǔ)言本身不支持我們?nèi)プ鲱愃朴谶@樣的操作typeof(_x)==typeof(_y),所以在此,通過(guò)故意判斷他們2個(gè)的地址指針是否相等,而顯然&_x,即x的地址,是不可能等于&_y的,但是這句話(void) (&_x == &_y);使得,如果_x和_y的類型不一樣,其指針類型也會(huì)不一樣,2個(gè)不一樣的指針類型進(jìn)行比較操作,則會(huì)引起編譯器產(chǎn)生一個(gè)編譯警告,提示你這兩個(gè)值的類型不同。

比如,如果你編譯下面這段代碼:

int x = 2;
char y = 3;
int m;
m = min(x,y);

編譯的時(shí)候,經(jīng)過(guò)預(yù)處理后,就會(huì)有這樣的判斷操作:

int * == char *;

因此編譯器就會(huì)提示你:

warning: comparison of distinct pointer types lacks a cast

所以,這個(gè)宏的巧妙之處就在于此。

所以,總結(jié)起來(lái)就是:

【提示】

1。其實(shí)關(guān)于min的宏,更好的做法是再加個(gè)const,即:

  1. #define min(x, y) ({ \
  2. const typeof(x) _x = (x); \
  3. const typeof(y) _y = (y); \
  4. (void) (&_x == &_y); \
  5. _x < _y ? _x : _y; })

2。(void) (&_x == &_y); 中的void,表示將表達(dá)式(&_x == &_y); 所得到的結(jié)果(此處肯定是邏輯上的假,值為0)忽略掉。如果不加void,則會(huì)提示你這行代碼是無(wú)意義的,沒(méi)人用到。

3。關(guān)于min的宏定義,為何這么復(fù)雜,而不是用簡(jiǎn)單的#define min(x,y) ((x) < (y) ? x : y)

因?yàn)?,如果如此定義,那么對(duì)于一些特殊的值傳入此宏之后,就會(huì)產(chǎn)生一些副作用,產(chǎn)生的結(jié)果,就不是我們想要的了,比如:

  min(++a,++b) ==> ((++a)<(++b))?(++a) : (++b) 
就使得,a++和b++分別執(zhí)行了2次,而且min的結(jié)果,也不對(duì)了。而用上面那個(gè)復(fù)雜的定義,多加了局部變量_x和_y,就可以避免此類問(wèn)題了。

【引用】

1。(void) (&_x == &_y);

2。如下的宏定義中(void) (&_x == &_y);是怎么做到判斷類型的?

http://linux./bbs/viewthread.php?tid=1161263

3。Linux內(nèi)核中的Min和Max函數(shù)

http://www./thread-1527-1-1.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多