我经常发现自己在写东西
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.