Ваш макрос в порядке. Если вы передадите 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);
}