如何仅在某些时候生成编译器警告?
假设大约每四个版本我想生成编译器警告,可能使用#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)))
所以,它看起来像我需要不同的解决方案
这并不完全清楚是什么问题。
您已经尝试不会工作,因为它是生成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。
你可以透露'main.cpp'的第105行吗? –
#if KISS/4 == 1 – Mawg