实现比较简单,需要注意括号和作用域的问题,由于 #define 只是做简单的替换,而 #define 中替代时可能含有表达式,因此我们需要用括号进行作用域限制。
C++
#include <iostream>
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
using namespace std;
int main ()
{
int var1 = 10, var2 = 100;
cout << MAX(var1, var2) << endl;
cout << MIN(var1, var2) << endl;
return 0;
}
/*
程序运行结果:
100
10
*/
上述可能存在重复计算的问题,比如表达式 X,Y 均计算了两次,多次计算在某些场景下性能较低或者会产生影响,我们可以进行简化如下:
C++
#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; })
上述的代码的优化如下:
C++
int x = 1, y = 2;
int z = MIN(x++, y);
上述的宏定义展开为:
z = (x++) < y ? (x++) : y;
此时执行完成后 x 变为了 3,与我们设想的 x 只累加一次不符合,此时我们可以定义临时变量 _min1 等于表达式 x 的计算结果,这样即可有效防止表达式被计算多次。同时我们使用 (void) (&_max1 == &_max2) 来检测传入的两个参数类型是否相同,这样即可防止传入不同类型的元素进行比较,最终我们返回二者的比较结果即可。
阅读量:2012
点赞量:0
收藏量:0