近日無意間發(fā)現(xiàn),關(guān)于常見的min的宏定義,在Linux中是這樣的: /* 關(guān)于其中的: (void) (&_x == &_y); 很是疑惑,表面看起來,這句話,好像不起作用,算是一句廢話,所以去找了一下別人的解釋,才大概搞懂是啥意思。 首先,我們此處想要實(shí)現(xiàn)的目的是,在計(jì)算兩個(gè)數(shù)的最小值之前,希望去判斷一下兩個(gè)值的類型是否一致,而由于C語言本身不支持我們?nèi)プ鲱愃朴谶@樣的操作typeof(_x)==typeof(_y),所以在此,通過故意判斷他們2個(gè)的地址指針是否相等,而顯然&_x,即x的地址,是不可能等于&_y的,但是這句話(void) (&_x == &_y);使得,如果_x和_y的類型不一樣,其指針類型也會(huì)不一樣,2個(gè)不一樣的指針類型進(jìn)行比較操作,則會(huì)引起編譯器產(chǎn)生一個(gè)編譯警告,提示你這兩個(gè)值的類型不同。 比如,如果你編譯下面這段代碼: int x = 2; 編譯的時(shí)候,經(jīng)過預(yù)處理后,就會(huì)有這樣的判斷操作: int * == char *; 因此編譯器就會(huì)提示你: warning: comparison of distinct pointer types lacks a cast 所以,這個(gè)宏的巧妙之處就在于此。 所以,總結(jié)起來就是: 【提示】 1。其實(shí)關(guān)于min的宏,更好的做法是再加個(gè)const,即:
2。(void) (&_x == &_y); 中的void,表示將表達(dá)式(&_x == &_y); 所得到的結(jié)果(此處肯定是邏輯上的假,值為0)忽略掉。如果不加void,則會(huì)提示你這行代碼是無意義的,沒人用到。 3。關(guān)于min的宏定義,為何這么復(fù)雜,而不是用簡單的#define min(x,y) ((x) < (y) ? x : y) 因?yàn)?,如果如此定義,那么對(duì)于一些特殊的值傳入此宏之后,就會(huì)產(chǎn)生一些副作用,產(chǎn)生的結(jié)果,就不是我們想要的了,比如: min(++a,++b) ==> ((++a)<(++b))?(++a) : (++b) 【引用】 1。(void) (&_x == &_y); 2。如下的宏定義中(void) (&_x == &_y);是怎么做到判斷類型的? http://linux./bbs/viewthread.php?tid=1161263 3。Linux內(nèi)核中的Min和Max函數(shù) |
|