题目:定义一个宏,求两个数的最大值。
合格答案
#define MAX(x,y) x > y ? x : y
当运行如下语句时会出Bug:
printf("MAX=%d",MAX(1!=1,1!=2));
中等答案
#define MAX(x,y) (x) > (y) ? (x) : (y)
当运行如下语句时会出Bug:
printf("MAX=%d",3 + MAX(1,2));
原因:+运算符的优先级大于比较运算符>
良好答案
#define MAX(x,y) ((x) > (y) ? (x) : (y))
当运行如下语句时会出出现Bug:
printf("MAX=%d",MAX(i++,j++));
原因:宏展开是将参数原样复制展开,导致i自加了两次,所以最好不要在宏里面加可变参数。
优秀答案
#define MAX(type,x,y)({ \
type _x = (x); \
type _y = (y); \
_x > _y ? _x : _y; \
})
到此,这就是一个比较完美的宏定义
更优秀答案
#define max(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x > _y ? _x : _y; \
})
(void) (&_x == &_y)的作用:(1) 给用户提示一个警告,对于不同类型的指针比较,编译器会发出一个警告,提示两种数据的类型不同;(2) 运算的结果没有用到,有些编译器可能会给一个warning,加一个(void)后,就可以消除这个警告。