日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

(转载) min()的宏定义中的(void) (_x == _y)的含义

發布時間:2023/12/15 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转载) min()的宏定义中的(void) (_x == _y)的含义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Original Address:http://www.crifan.com/2010/08/13/order_min__macro_definition_void_amp__x__amp__y_the_meaning_of/

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

近日無意間發現,關于常見的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; })

關于其中的:

(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

【提示】

1。其實關于min的宏,更好的做法是再加個const,即:

  • #define min(x, y) ({
  • const typeof(x) _x = (x);
  • const typeof(y) _y = (y);
  • (void) (&_x == &_y);
  • _x < _y ? _x : _y; })
  • 2。(void) (&_x == &_y); 中的void,表示將表達式(&_x == &_y); 所得到的結果(此處肯定是邏輯上的假,值為0)忽略掉。如果不加void,則會提示你這行代碼是無意義的,沒人用到。

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

    因為,如果如此定義,那么對于一些特殊的值傳入此宏之后,就會產生一些副作用,產生的結果,就不是我們想要的了,比如:

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

    【引用】

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

    http://hi.baidu.com/huahua9901/blog/item/9640223f2a37773470cf6cc4.html

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

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

    3。Linux內核中的Min和Max函數

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

    防君子不防也無法防小人的聲明:?
    如未注明轉載則均為crifan原創,對于原創文章,轉載請注明出處:在路上 - on the way?
    本文鏈接:【整理】min()的宏定義中的(void) (&_x == &_y)的含義

    總結

    以上是生活随笔為你收集整理的(转载) min()的宏定义中的(void) (_x == _y)的含义的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。