内联功能或多或少安全

时间:2013-11-25 21:29:52

标签: c++ function inline

“内联”是否比使用“max”的预编译器定义更安全或更不安全(见下文)?

#define max(a,b)    (a > b) ? a : b

鉴于此功能定义:

inline int max (int a, int b)
{
  return (a > b) ? a : b;
}

3 个答案:

答案 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 );