手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux内核中min和max的实现

[日期:2016-03-03] 来源:Linux社区  作者: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.  
  12.  #define max(x, y) ({ \
  13.          typeof(x) _max1 = (x); \
  14.          typeof(y) _max2 = (y); \
  15.          (void) (&_max1 == &_max2); \
  16.          _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同样类型的两个临时变量,然后对临时变量进行求最大值或者最小值。

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-03/128865.htm

linux
相关资讯       Linux函数 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款