我已经实现了自己的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_MAX
和RND_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));
答案 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)
答案 2 :(得分:1)
我建议你忘记RND_ROUND
:这是编译时间,无论如何!
#define RND_BASE 1000000
#define RND_MIN RND_BASE
#define RND_MAX (RND_BASE*10)
现在,如果您在编译时确实需要RND_ROUND
,RND_MIN
和RND_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)
,以便不会出现整数溢出。