2013-07-29 87 views
0

我已經實現了自己的tmpnam()函數來創建臨時文件。我用下面的定義調整這一個:C宏定義了可變長度值

/* 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_ROUND在編譯時RND_MINRND_MAX生產?

例子:

#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

你可以使用電源功能? –

+0

你可以使用二進制模式嗎? –

+0

嗯,通常我可以,但我認爲這不是可取的方法,因爲'RND_MIN'和'RND_MAX'在運行時永遠不會改變,因此每次調用(像'create_tmp_file'函數)計算它們會浪費資源。 – likern

回答

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))) 
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?

+0

這是否意味着它不在編譯時,它會在運行時執行? – likern

+0

@ user966467'power'函數將在運行時調用 –

+0

@ user966467讀取[Binary to Decimal](http://math.stackexchange.com/questions/454716/binary-to-decimal),所以你必須使用'pow ()'功能沒有其他方式我猜。 –

1

我建議你忘掉RND_ROUND:這是編譯時間,反正!現在

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

,如果你真的需要RND_ROUND,在編譯時RND_MINRND_MAX,而不是被擴大到pow,假設你RND_ROUND是不是你可以用#if分支它(注意,g_rand_int_range限制爲gint32,所以RND_MAX < 2^31 = 2'147'483'648 < 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) 

這也將是更安全的,限制RND_ROUND以便不會有整數溢出。