linux内核源码中max和min的宏实现
2017-09-18 20:59
302 查看
今天去参加腾讯旗下互联网金融公司腾富博的初面。面试官出了这样一道题:用宏实现max,要求考虑各种非法情况。当时我回想起来《Effective C++》这本书有这方面的讨论(条款02:尽量以const,enum,inline替换#define)。可是我记得书中最后给出的方案是用模板内联函数实现的,如下:
所以无奈之下我想了一个折中的办法。我先给面试官写了这个max的经典的(作为反面教材<_<)宏实现:
那么我们来看一下这种实现有哪些技巧。
首先是
其次是语句
最后就是语句
本文参考链接:http://blog.sbw.so/Article/index/title/Linux
4000
源码中对 min,max 函数的宏实现.html
template<class T> inline T max(const T& x, const T& y) { return x > y ? x : y; }
所以无奈之下我想了一个折中的办法。我先给面试官写了这个max的经典的(作为反面教材<_<)宏实现:
#define max(x,y) ((x)>(y)?(x):(y))。然后,我对他说这个写法是有问题的,他问我有什么问题,我就举了一个例子:
max(x++,y),最后面试官点点头这个问题就过去了。不过面试完之后仔细想想这个问题,我还真没见过一种宏实现是没有问题的,所以只好求助万能的度娘,最终真找到了一个没有问题的实现(目前我看不出来有什么问题),也就是linux内核源码中的实现。
#define max(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void)(&_max1 == &_max2); \ (_max1 > _max2 ? _max1 : _max2);}) #define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void)(&_min1 == &_min2); \ (_min1 > _min2 ? _min1 : _min2);})
那么我们来看一下这种实现有哪些技巧。
首先是
typeof操作符的使用,它可以计算出表达式x的类型。例如,语句
int a; typeof(a) b;中的
typeof(a)完全可以替换为
int。
其次是语句
(void)(&_min1 == &_min2);。这个语句的后半部分是一条判断语句,其实并不关心比较的结果,只是利用它进行类型检查,如果x和y的类型不一样,那么编译器会发出警告。
(void)语句在这里也必不可少,如果没有这个语句,那么编译器会认为后半部分的结果没有处理,是一个无效语句,编译器会发出警告。加上
(void)语句后,编译器会认为后半部分的的结果已经处理,就不会有警告发出。
最后就是语句
(_min1>_min2?_min1:_min2);。因为不需要使用
x和
y代入三目运算符,所以就不会出现
max(x++,y)后
x++语句可能执行两次的情况。
本文参考链接:http://blog.sbw.so/Article/index/title/Linux
4000
源码中对 min,max 函数的宏实现.html
相关文章推荐
- 解释Linux内核源码中的container_of宏及其标准C版本实现
- cartographer源码分析(29)-io-min_max_range_filtering_points_processor.h
- 脚本实现sum/avg/max/min-求文本中每行数字
- Linux内核源码分析--内存管理(二、函数实现技巧)
- 【C语言】Linux内核源码--min,swap宏定义
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
- ie6实现min-width/max-width
- matlab imregionalmax/imregionalmin 函数 C++实现
- Linux内核源码--min,swap宏定义
- ie6 css expression 实现min-width/max-width
- 堆的实现,提供 min_heap and max_heap功能
- SQL Server 2005中开发通用的自定义函数,实现类似Min或MAX函数功能(附源码)
- matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)
- linux内核中的min(x, y)和max(x, y)宏定义
- 用min-width/max-width实现图片缩放裁切
- 实现O(1)时间复杂度带有min和max 函数的栈
- Android6.0源码开发之修改默认音量default及max和min
- 解决IE6中不能实现min-width和max-width的问题
- Linux内核源码之信号量的实现
- 最详尽解释Linux内核源码中的container_of宏及其标准C版本实现