我的夹具宏有问题,当我的值超过10且我的高度超过17时它停止工作。有什么想法吗?
#define CLAMP(value, low, high) (((value)<(low))?(low):(((value)>(high))?(high):(value)))
答案 0 :(得分:15)
我建议使用比宏更安全的方式:
template <typename T> T CLAMP(const T& value, const T& low, const T& high)
{
return value < low ? low : (value > high ? high : value);
}
答案 1 :(得分:4)
你的宏很好。如果您传入的high
小于low
,您会看到奇怪的结果,但这不太可能是原因。
最有可能的结果是您传入的是具有副作用的表达式,例如使用++
运算符或调用函数。如果你有一个具有副作用的表达式,那么由于宏替换的工作方式,副作用可能会多次发生。例如:
CLAMP(x++, low, high) // expands to:
(x++ < low) ? low : ((x++ > high) ? high : x++);
x++
被多次评估,这绝对不是你想要的(由于缺少序列点,它是未定义的行为)。
我建议将宏重写为模板:
template <typename T> T CLAMP(T value, T low, T high)
{
return (value < low) ? low : ((value > high) ? high : value);
}
答案 2 :(得分:1)
使用已建议的模板功能是一种更好的解决方案。
无论如何,如果你遇到这种问题(包括宏或函数),你应该简化你的表达;看看这个伪代码:
max(a,b): a>b ? a : b
min(a,b): a<b ? a : b
clamp(x,lo,hi): min( hi, max(lo,x) )
答案 3 :(得分:-1)
您也可以将其设为inline
功能,这样就像一个宏但更安全。