Linux内核中min和max的实现
实现min和max这两个函数,可以有三种形式:1)定义宏;2)定义函数; 3)定义inline函数。以定义宏举例,一般都是以下形式:
- #define min(x,y) ((x)>(y)?(y):(x))
- #define max(x,y) ((x)>(y)?(x):(y))
但是上面的写法是有副作用的。比如输入:
- minval = min(x++, y);
替换宏之后,代码变成:
- minval = ((x++)>(y)?(y):(x++))
可以看出,如果x是最小值,那么它加了两次,很明显是不对的。
Linux内核实现min和max宏:
- /*
- * min()/max() macros that also do
- * strict type-checking.. See the
- * "unnecessary" pointer comparison.
- */
- #define min(x, y) ({ \
- typeof(x) _min1 = (x); \
- typeof(y) _min2 = (y); \
- (void) (&_min1 == &_min2); \
- _min1 < _min2 ? _min1 : _min2; })
- #define max(x, y) ({ \
- typeof(x) _max1 = (x); \
- typeof(y) _max2 = (y); \
- (void) (&_max1 == &_max2); \
- _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同样类型的两个临时变量,然后对临时变量进行求最大值或者最小值。
相关推荐
farwang 2020-11-25
星愿心愿 2020-11-24
tianhuak 2020-11-24
zhjn0 2020-11-24
昭君出塞 2020-11-23
bluecarrot 2020-11-23
linuxwcj 2020-10-21
以梦为马不负韶华 2020-10-20
彼岸随笔 2020-10-20
yutou0 2020-10-17
applecarelte 2020-10-16
ourtimes 2020-10-16
waterhorse 2020-09-19
MRFENGG 2020-11-11
rainandtear 2020-10-30
kyssfanhui 2020-10-20
liuhangtiant 2020-10-20