欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-22 11:21:16
...

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;\
})

上述实现方式仅适用于两个 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 可避免该警告。