我的夹具宏有问题,当我的价值超过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 功能,所以它就像一个宏,但更安全。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top