19

我曾在项目偏好中设想过其中之一

  • 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

我确信这不是标准行为,因为 ifTESTING没有定义那么它肯定不等于HOST,而且我不需要#ifdef TESTINGGCC 编译器的额外内容。

但是,当我使用 Atmel AVR Studio(我认为它基于 MS Visual Studio)时,有必要#ifdef TESTING在几十个地方添加该首字母 :-(

看起来我别无选择,但我只是想知道是否有任何 C 标准真的需要这个。

4

5 回答 5

38
#if TESTING==HOST

如果TESTING没有定义,那么

它相当于:

#if 0==HOST

来自 C 标准:

(C99,6.10.1p4)“在执行了由于宏扩展和定义的一元运算符而导致的所有替换之后,所有剩余的标识符(包括那些在词法上与关键字相同的标识符)都被替换为 pp-number 0””

于 2012-10-30T23:45:30.173 回答
11

请注意,您可以这样做:

#ifndef TESTING
    ...
#elif TESTING == HOST
    ...
#elif TESTING == TARGET
    ...
#else
    #error "Unexpected value of TESTING."
#endif

还:

#if defined(TESTING) && TESTING == HOST
    ...
#endif

如果你想折叠测试。括号是可选的(#if defined TESTING有效),但我认为包含它们更清楚,尤其是当您开始添加其他逻辑时。

于 2012-10-31T00:11:33.207 回答
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
于 2012-10-30T23:47:11.047 回答
1

我有同样的问题。如果没有定义我想要的#if 参数,它曾经是编译器会出错。我学到了艰难的方式,这不再是这种情况。我想出的解决方案如下:

#define BUILDOPT 3

#if 3/BUILDOPT == 1
    <compile>
#endif

如果 BUILDOPT 未定义,则除以 0 时会出现编译错误。如果 BUILDOPT != 3 && > 0 则 #if 失败。

于 2017-06-26T19:16:39.867 回答
0

我的最终实现是将 BUILDOPT 设置为 1 以启用代码,> 1 以禁用。然后#if 变为#if 1/BUILDOPT==1。

于 2017-06-26T19:34:18.287 回答