如以下代码
#define MAX(a,b) (a)>(b)?(a):(b)
int a = 5, b = 0;
MAX(++a, b);
a = 5, b = 0;
MAX(++a, b + 10);
两次MAX调用后,a的值分别是多少呢?
由于define 仅仅只是粗暴的替换,替换后的表达式为:
(++a)>(b)?(++a):(b)
显然++a要大于b,因此会执行两次++a。
如上,在使用宏构成函数时,无法确定用户如何使用你的宏,应尽量避免!
使用模板:
template<typename T1, typename T2>
constexpr auto MAX(T1 a, T2 b) { return (a)>(b)?(a):(b); }