9

私はしばしば自分が次のようなことを書いていることに気づきます

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

これを 1 行のマクロとして記述できるようにしたいと考えています。既存のシステム マクロ MIN および MAX と同じように、副作用がなく、MIN および MAX と同じデータ型で機能する必要があります。

これを単一のマクロに変換する方法を誰か教えてもらえますか?

4

5 に答える 5

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_HIGH、、、BOUNDSですCLIPPED

于 2013-02-08T10:17:32.087 に答える
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)))
于 2013-02-08T09:58:01.860 に答える
2

多分あなたはそのようにそれを試してみたい:

template <class T> 
const T& clamp(const T& value, const T& low, const T& high) {
    return value < low ? low:
           value > high? high:
                         value;
}
于 2013-02-08T09:46:57.860 に答える
1
 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 
 #define MIN(a, b) (((a) > (b)) ? (b) : (a))

1 つの #define ディレクティブで作成すると、読みにくくなります。

于 2013-02-08T09:56:45.113 に答える
-1

比較操作を 1 つだけ使用する:

static inline int clamp(int value, int min, int max) {
    return min + MIN((unsigned int)(value - min), max - min)
}
于 2013-02-08T09:55:28.397 に答える