C宏定义了可变长度值

时间:2013-07-29 08:38:59

标签: c macros

我已经实现了自己的tmpnam()函数来创建临时文件。我使用以下定义来调整这个:

/* The length of random string. In /tmp/test143276 is 143246 */
#define RND_ROUND 6
/* Used as a minimal bound produced by number generator      */
#define RND_MIN 100000
/* Used as a maximum bound produced by number generator      */
#define RND_MAX 1000000

正如您所看到的,真正需要的宏是RND_ROUND而其他宏是派生的,以传递给数字生成器。产生的公式是:

RND_MIN = 1 and [RND_ROUND-1] zeros
RND_MAX = 1 and [RND_ROUND] zeros

问题:如何在编译时创建一些基于RND_MIN生成RND_MAXRND_ROUND的宏?

示例:

#define RND_ROUND 6
// somehow define those RND_MIN and RND_MAX
...
int32_t random = g_rand_int_range(generator, RND_MIN(RND_ROUND), RND_MAX(RND_ROUND));

3 个答案:

答案 0 :(得分:3)

您可以使用电源功能来完成工作。

#define RND_MIN (pow (10, RND_ROUND-1))
#define RND_MAX (pow (10, RND_ROUND))

或者取决于传递的参数。

#define RND_MIN(val) (pow (10, (val)-1))
#define RND_MAX(val) (pow (10, (val)))

答案 1 :(得分:3)

如果我是正确的,你可以使用电源功能:

#define RND_MIN(RND_ROUND)  pow(10, RND_ROUND - 1)
#define RND_MAX(RND_ROUND)  pow(10, RND_ROUND)

您可能希望阅读:How to simplify this power equation?

答案 2 :(得分:1)

我建议你忘记RND_ROUND:这是编译时间,无论如何!

#define RND_BASE 1000000
#define RND_MIN RND_BASE
#define RND_MAX (RND_BASE*10)

现在,如果您在编译时确实需要RND_ROUNDRND_MINRND_MAX而未扩展为pow,那么假设您RND_ROUND不是您可以使用#if对其进行分支(请注意g_rand_int_range仅限于gint32,因此RND_MAX< 2^31 = 2'147'483'648< {{1可能):

10^10

这也会更安全,限制#if RND_ROUND <= 1 # define RND_MIN 1 #elif RND_ROUND <= 2 # define RND_MIN 10 #elif RND_ROUND <= 3 # define RND_MIN 100 #elif RND_ROUND <= 4 # define RND_MIN 1000 #elif RND_ROUND <= 5 # define RND_MIN 10000 #elif RND_ROUND <= 6 # define RND_MIN 100000 #elif RND_ROUND <= 7 # define RND_MIN 1000000 #elif RND_ROUND <= 8 # define RND_MIN 10000000 #else # define RND_MIN 100000000 #endif #define RND_MAX (RND_MIN*10) ,以便不会出现整数溢出。