预处理器相等性测试,是这个标准吗?

时间:2012-10-30 23:42:34

标签: c c-preprocessor

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

  • 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标准真的需要这个。

5 个答案:

答案 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.