题
我的夹具宏有问题,当我的价值超过10且高高超过17时,它停止工作。任何的想法?
#define CLAMP(value, low, high) (((value)<(low))?(low):(((value)>(high))?(high):(value)))
解决方案
我建议使用比宏更安全的方式:
template <typename T> T CLAMP(const T& value, const T& low, const T& high)
{
return value < low ? low : (value > high ? high : value);
}
其他提示
你的宏很好。如果您通过 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);
}
如已经建议的那样,使用模板函数是一个更好的解决方案。
无论如何,如果您遇到了这种问题(无论是带有宏还是功能),则应简化表达式;看这个伪代码:
max(a,b): a>b ? a : b
min(a,b): a<b ? a : b
clamp(x,lo,hi): min( hi, max(lo,x) )
你也可以把它做成 inline
功能,所以它就像一个宏,但更安全。
不隶属于 StackOverflow