我曾在项目偏好中设想过其中一项
TESTING
= HOST
TESTING
= TARGET
TESTING
未定义我的问题在于后者。
似乎不是
#if TESTING==HOST
#error "HOST defined" // add temporarilly for testing porpoises
#endif
我需要编码
#ifdef TESTING
#if TESTING==HOST
#error "HOST defined" // add temporarilly for testing porpoises
#endif
#endif
我确信这不是标准行为,因为如果没有定义TESTING
那么它肯定不等于HOST
,而我不需要额外的#ifdef TESTING
GCC编译器。
但是,当我使用Atmel AVR Studio(我认为基于MS Visual Studio)时,有必要在几十个地方添加初始#ifdef TESTING
: - (
看起来我别无选择,但我只是想知道是否有任何C标准真的需要这个。
答案 0 :(得分:25)
#if TESTING==HOST
如果未定义TESTING
,则
相当于:
#if 0==HOST
来自C标准:
(C99,6.10.1p4)“在完成由于宏扩展和已定义的一元运算符的所有替换后,所有剩余的标识符(包括与关键字词法相同的标识符)将替换为pp-number 0”“
答案 1 :(得分:7)
请注意,您可以这样做:
#ifndef TESTING
...
#elif TESTING == HOST
...
#elif TESTING == TARGET
...
#else
#error "Unexpected value of TESTING."
#endif
此外:
#if defined(TESTING) && TESTING == HOST
...
#endif
如果要折叠测试。括号是可选的(#if defined TESTING
是有效的)但我认为包含它们更清楚,特别是当你开始添加额外的逻辑时。
答案 2 :(得分:3)
在使用符号之前,原始C预处理器需要显式#ifdef
验证。这是一个相对较新的创新(可能由像Javascript这样的脚本语言驱动),假设未定义的符号具有默认值。
为什么不总是确保符号被定义?:
#ifndef TESTING
#define TESTING (default value)
#endif
#if TESTING==HOST
...
#elif TESTING==TARGET
...
#else
...
#endif
替代方案,也许强制选择?:
#ifndef TESTING
#error You must define a value for TESTING
#endif
答案 3 :(得分:1)
我遇到了同样的问题。如果未定义#if参数,那么编译器会错误,这就是我想要的。我学到了很难的方法。我想出的解决方案如下:
#define BUILDOPT 3
#if 3/BUILDOPT == 1
<compile>
#endif
如果未定义BUILDOPT,则会得到除以0的编译错误。如果BUILDOPT!= 3&amp;&amp; &GT; 0 #if失败。
答案 4 :(得分:1)
我的最终实现是将BUILDOPT设置为1以启用代码,&gt; 1禁用。然后#if变为#if 1 / BUILDOPT == 1.