1、最常见的实现方法
#define MAX(X, Y) \
((X) > (Y) ? (X) : (Y))
上述实现方式对于参数具有副作用的情况,很容易出现意想不到的结果。比如:
int a = 2;
int b = 3;
int max = MAX(a++, b++);
2、防止参数副作用 在对比之前,保留一份备份,用备份参数来进行对比。
#define MAX(X, Y) ({\
int _X = (X);
\
int _Y = (Y);
\
_X > _Y ? _X : _Y;
\
})
【【C】用一个宏实现求两个数中的最大数】上述实现方式仅适用于两个 int 类型数据比较。
3、指定参数类型 传入 type 参数。
#define MAX(TYPE, X, Y) ({\
TYPE _X = (X);
\
TYPE _Y = (Y);
\
_X > _Y ? _X : _Y;
\
})
上述实现方式有可能传入两个不同类型的数据。
4、typeof 获取参数类型
#define MAX(X, Y) ({\
typeof(X) _X = (Y);
\
typeof(Y) _Y = (Y);
\
(void)(&_X == &_Y);
\
_X > _Y ? _X : _Y;
\
})
通过 typeof 关键字,来获取参数的类型,并且保存参数的一份拷贝。由于 &_X ==&_Y 的比较结果没有被使用,gcc 编译时就会有警告,强制转换为 void 可避免该警告。