【C】用一个宏实现求两个数中的最大数

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 可避免该警告。

    推荐阅读