2015-10-14 83 views
1

假設大約每四個版本我想生成編譯器警告,可能使用#warning或者有條件地聲明應該生成溢出警告的int x = 3.14;之類的東西。如何僅在某些時候生成編譯器警告?

我怎麼能這樣做,只使用前任?

有些問題看起來不錯,但我看不出如何生成隨機數之間和4或採取其所產生大量的模量:

How can I generate unique values in the C preprocessor?

How to generate a series of random numbers with the C/C++ preprocessor

Generate a random number using the C Preprocessor


[更新]我忘了說,我不得不C++ 2003 :-(

我把答案從Generate a random number using the C Preprocessor和剛添加

#if KISS/4 == 1 
#warning Danger, Will Robinson! 
#endif 

但後來我得到

../test/main.cpp:105:5: error: token "=" is not valid in preprocessor expressions 

參考線

#if KISS/4 == 1 

KISS擴張到

(((((z=36969*(z&65535)+(z>>16))<<16)+((w=18000*(w&65535)+(w>>16))&65535))^(jcong=69069*jcong+1234567))+(jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5)))

所以,它看起來像我需要不同的解決方案

+1

你可以透露'main.cpp'的第105行嗎? –

+0

#if KISS/4 == 1 – Mawg

回答

2

這並不完全清楚是什麼問題。

您已經嘗試不會工作,因爲它是生成C代碼,其生成僞隨機數序列 ,在C代碼塊使用的宏內置 方法的解決方案。生成的代碼包含 賦值給C變量,因此在預處理器 指令中當然是非法的:預處理器沒有變量或賦值。

你說你不知道如何使用預處理採取了大量的隨機數, 的模數4,即使假設你可以得到一個在預處理 指令,也許這困難是由圖所示:

#if KISS/4 == 1 

那不是如何讓4 KISS模量:它相當於

#if KISS == 4 

KISS模4爲KISS % 4,並在準備進行測試的方式rocessor 指令,如果KISS是4的倍數爲:

#if (KISS) % 4 == 0 

問題標題中提到,只應使用預處理器生成的隨機 值沒有要求,但內 你問後如何是可以做到的只使用預處理器。如果 目的僅僅是爲了產生一個編譯器警告大約一時間 在4,然後我看不出爲什麼單單應該用來 預處理器實現這一點,我瘦到你已經錯誤地認爲,它必須從 視圖事實上編譯器警告必須由 某個預處理器#if -test觸發。

最明顯的當然是讓你的構建過程 - make或 什麼 - 產生了一系列的4一個隨機數,並通過該 值作爲命令行宏定義的 源文件的彙編,其中警告將偶爾產生。

你不說什麼操作系統您正在使用的,但 說明使用shuf作爲RNG的ubuntu:

的main.cpp

#if (FORTUNE) % 4 == 0 
#warning Whoops! 
#endif 

int main() 
{ 
    return 0; 
} 

一些構建: -

$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
main.cpp:2:2: warning: #warning Whoops! [-Wcpp] 
#warning Whoops! 
^
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
main.cpp:2:2: warning: #warning Whoops! [-Wcpp] 
#warning Whoops! 
^
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
main.cpp:2:2: warning: #warning Whoops! [-Wcpp] 
#warning Whoops! 
^
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
main.cpp:2:2: warning: #warning Whoops! [-Wcpp] 
#warning Whoops! 
^
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
$ g++ -DFORTUNE=$(shuf -i 1-4 -n 1) main.cpp 
main.cpp:2:2: warning: #warning Whoops! [-Wcpp] 
#warning Whoops! 
^

如果你使用那個shuf命令,那麼隨機值總是在[1-4]的範圍內,所以 您的測試可能只是#if FORTUNE == 4,但 模測試將允許您使用任何其他RNG。