我怎么能写一个' clamp' /'剪辑' /'绑定'用于返回给定范围内的值的宏?

时间:2013-02-08 09:39:41

标签: objective-c c macros predefined-macro

我经常发现自己写的是

int computedValue = ...;
return MAX(0, MIN(5, computedValue));

我希望能够将其写为单个单行宏。它必须没有副作用,就像现有的系统宏MIN和MAX一样,并且应该适用于与MIN和MAX相同的数据类型。

有谁能告诉我如何将其变成一个宏?

5 个答案:

答案 0 :(得分:18)

这没有副作用,适用于任何原始数字:

#define MIN(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __a : __b; })
#define MAX(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __b : __a; })

#define CLAMP(x, low, high) ({\
  __typeof__(x) __x = (x); \
  __typeof__(low) __low = (low);\
  __typeof__(high) __high = (high);\
  __x > __high ? __high : (__x < __low ? __low : __x);\
  })

可以这样使用

int clampedInt = CLAMP(computedValue, 3, 7);
double clampedDouble = CLAMP(computedValue, 0.5, 1.0);

其他建议的名称可以是CLAMPVALUE_CONSTRAINED_LOW_HIGHBOUNDS,而不是CLIPPED

答案 1 :(得分:3)

取自本网站http://developer.gnome.org/glib/2.34/glib-Standard-Macros.html#CLAMP:CAPS

#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))

答案 2 :(得分:2)

也许你想这样尝试:

template <class T> 
const T& clamp(const T& value, const T& low, const T& high) {
    return value < low ? low:
           value > high? high:
                         value;
}

答案 3 :(得分:1)

 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 
 #define MIN(a, b) (((a) > (b)) ? (b) : (a))

在一个#define指令中制作它不会非常易读。

答案 4 :(得分:-1)

只使用一次比较操作:

static inline int clamp(int value, int min, int max) {
    return min + MIN((unsigned int)(value - min), max - min)
}