“内联”是否比使用“max”的预编译器定义更安全或更不安全(见下文)?
#define max(a,b) (a > b) ? a : b
鉴于此功能定义:
inline int max (int a, int b)
{
return (a > b) ? a : b;
}
答案 0 :(得分:8)
存在语义差异:
max(pay_wife(1000), get_salary());
答案 1 :(得分:4)
宏版本将多次评估其参数,如果参数有副作用(如调用非const函数),将导致语义差异(错误)。
此外,参数不是每个都包含在parens中,因此可能有其他方式可以编写参数,以便优先级完全改变所尝试内容的含义。例如,max(c, x < y)
将折叠为(c > x < y) ? c : x < y
,它将评估c > x
,然后将其与y
的真实性进行比较。这完全不是我想要的。
另一方面,内联函数仅适用于没有截断的整数类型。
更好的方法是不重新发明轮子并使用std::max
来处理上述所有问题,并由您的实施轻松提供。
答案 2 :(得分:1)
宏有很多负面的副作用。例如,考虑
max( ++a, b );