在 C 中定义“之间”宏的最佳方法

std*_*all 3 c macros coding-style

定义一个 between 宏的最佳方法是什么,它是泛型类型 (char,int,long),如果一个数字介于输入的其他数字之间,它将返回 true。我试图用谷歌搜索它,但我没有找到任何东西。

编辑:给出的两个边界的顺序无关紧要。所以它可以更通用。

Teu*_*ndo 5

如果您执行以下操作:

#define BETWEEN(a, b, c)  (((a) >= (b)) && ((a) <= (c)))
Run Code Online (Sandbox Code Playgroud)

你会对 的双重评估有问题a。想想如果你用一个有副作用的函数来做会发生什么......

你应该做一些类似的事情:

#define BETWEEN(a, b, c) ({ __typeof__ (a) __a = (a); ((__a) >= (b) && ((__a) <= (c)) })
Run Code Online (Sandbox Code Playgroud)

(编辑是因为结果不应该取决于 b 和 c 的顺序):

#define BETWEEN(a, b, c) \
           ({ __typeof__ (a) __a = (a);\
              __typeof__ (b) __b = (b);\
              __typeof__ (c) __c = (c);\
               (__a >= __b && __a <= __c)||\
               (__a >= __c && __a <= __b)})
Run Code Online (Sandbox Code Playgroud)

  • 对,但是。`({})` 和 `__typeof__` 都是 gcc 扩展。 (5认同)