linuxcmax函数头⽂件,Linux内核中是怎么实现min和max函数Linux内核代码有很多很经典的代码,仔细去看看,可以学到很多知识。今天说说Linux是怎么实现min和max的。max和min函数都是⽐较常⽤的,可以⽤函数,或者利⽤宏去实现,⼀般我们会这样去写: #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; })
#define min3(x, y, z) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
typeof(z) _min3 = (z); \
(void) (&_min1 == &_min2); \
(void) (&_min1 == &_min3); \
_min1 < _min2 ? (_min1 < _min3 ? _min1 : _min3) : \
(_min2 < _min3 ? _min2 : _min3); })
#define max3(x, y, z) ({ \
typeof(x) _max1 = (x); \
typeof(y) _max2 = (y); \
linux内核文件放在哪typeof(z) _max3 = (z); \
(void) (&_max1 == &_max2); \
(void) (&_max1 == &_max3); \
_max1 > _max2 ? (_max1 > _max3 ? _max1 : _max3) : \
(_max2 > _max3 ? _max2 : _max3); })
⾥⾯有很多东西都没见过,但是它能解决传统的min/max宏带来的副作⽤。下⾯来⼀⼀说⼀下上⾯宏的含义:typeof(xxx)含义。
typeof(xxx)的含义是⽤来获取xxx的类型,⽐如上⾯的 typeof(x) _min1 = (x);
typeof(x)是获得x的类型,上⾯的含义相当于 int _min1 = (x);
({XXXX})含义。
({XXXX})类似与C中的逗号表达式,XXXX可以包含有多条语句(可以是变量定义、复杂的控制语句),该表达式的值为XXXX中的最后⼀条语句的值。⽐如下⾯ #include
using namespace std;
int main(){
int lastValue = 0;
lastValue = ({
int x = 1, y = 10;
for(int i = 1; i <= y; i++){
x *= i;
}
x;
});
cout << lastValue << endl;
return 0;
}
结果是10的阶乘值。
结合了type和({})可以很好的消除宏的副作⽤。⽐如上⾯的 minval = min(x++, y);
如果代⼊了Linux内核中的min宏,扩展之后会变成: minval = ({ \
typeof(x) _min1 = (x++); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
可以看到,x只被加了⼀次,如果x是最⼩值,结果是正确的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论