如何仅在某些时候生成编译器警告?

问题描述:

假设大约每四个版本我想生成编译器警告,可能使用#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

这并不完全清楚是什么问题。

您已经尝试不会工作,因为它是生成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。