请定义一个宏函数,求两个数的最大值
- 合格:
#define MAX(x,y) x > y ? x : y
//测试一下??
MAX(1 != 1, 1 != 2);
- 中等
#define MAX(x,y) (x) > (y) ? (x) : (y)
//测试一下??
3 + MAX(1,2);
- 良好
#define MAX(x,y) ((x) > (y) ? (x) : (y))
//测试一下??
3 + MAX(i++,j++);
- 优秀
#define MAX(x,y) ({ \
int _x = x; \
int _y = y; \
_x > _y ? _x : _y; \
})
//测试一下??
MAX(3.65,3.68);
- 资深
#define MAX(type, x, y) ({ \
type _x = x; \
type _y = y; \
_x > _y ? _x : _y; \
})
//测试一下??
其中在简化可以做到 typeof(x) x = _x; 这是linux的GCC特性,linux内核有
#define min(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
如果x和y的类型不一样,其指针类型也会不一样,2个不一样的指针类型进行比较操作,会抛出一个编译警告,巧妙就巧妙在这里。