我经常发现自己写的东西一样
int computedValue = ...;
return MAX(0, MIN(5, computedValue));
我希望能够写这个作为一个单行宏。 它必须是无副作用,以同样的方式,现有的系统宏MIN和MAX是,而且应该为相同的数据类型MIN和MAX工作。
谁能告诉我怎么把它变成一个宏?
我经常发现自己写的东西一样
int computedValue = ...;
return MAX(0, MIN(5, computedValue));
我希望能够写这个作为一个单行宏。 它必须是无副作用,以同样的方式,现有的系统宏MIN和MAX是,而且应该为相同的数据类型MIN和MAX工作。
谁能告诉我怎么把它变成一个宏?
这是一个没有副作用,适用于任何原始号码:
#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);
其他建议的名称,而不是CLAMP
可以VALUE_CONSTRAINED_LOW_HIGH
, BOUNDS
, CLIPPED
。
从本网站采取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)))
也许你想尝试一下这样的:
template <class T>
const T& clamp(const T& value, const T& low, const T& high) {
return value < low ? low:
value > high? high:
value;
}
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) > (b)) ? (b) : (a))
使得它在一个#define指令将不会是非常具有可读性。
只用一个比较操作:
static inline int clamp(int value, int min, int max) {
return min + MIN((unsigned int)(value - min), max - min)
}