乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

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

      近日無意間發(fā)現(xiàn),關(guā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);

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

      首先,我們此處想要實(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;
      char y = 3;
      int m;
      m = min(x,y);

      編譯的時(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,即:

      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ì)提示你這行代碼是無意義的,沒人用到。

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

      【引用】

      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)購買等信息,謹(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)論公約

        類似文章 更多