歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核中min和max的實現

Linux內核中min和max的實現

日期:2017/3/1 9:18:26   编辑:Linux內核

實現min和max這兩個函數,可以有三種形式:1)定義宏;2)定義函數; 3)定義inline函數。以定義宏舉例,一般都是以下形式:

  1. #define min(x,y) ((x)>(y)?(y):(x))
  2. #define max(x,y) ((x)>(y)?(x):(y))

但是上面的寫法是有副作用的。比如輸入:

  1. minval = min(x++, y);

替換宏之後,代碼變成:

  1. minval = ((x++)>(y)?(y):(x++))

可以看出,如果x是最小值,那麼它加了兩次,很明顯是不對的。

Linux內核實現min和max宏:

  1. /*
  2. * min()/max() macros that also do
  3. * strict type-checking.. See the
  4. * "unnecessary" pointer comparison.
  5. */
  6. #define min(x, y) ({ \
  7. typeof(x) _min1 = (x); \
  8. typeof(y) _min2 = (y); \
  9. (void) (&_min1 == &_min2); \
  10. _min1 < _min2 ? _min1 : _min2; })
  11. #define max(x, y) ({ \
  12. typeof(x) _max1 = (x); \
  13. typeof(y) _max2 = (y); \
  14. (void) (&_max1 == &_max2); \
  15. _max1 > _max2 ? _max1 : _max2; })

1、typeof(X)的用途:得到X的類型信息,比如typeof(10) 為int, typeof(1.0)為double。

2、({})的用途:一句語句,({ 和 })之間可以有很多表達式,它的值為最後一個表達式的值。

3、(void)(&_x == &_y);這一句的作用:判斷_x和_y的類型是否一樣。
如果是不同的類型,編譯器會報“warning: comparison of distinct pointer types lacks a cast”的警告信息。

其實,內核的宏定義就是先引入和x及y同樣類型的兩個臨時變量,然後對臨時變量進行求最大值或者最小值。

Copyright © Linux教程網 All Rights Reserved