2012-11-26 87 views
4

我已经写类似如下:预处理语句问

#define ABC20 
//#define ABC10 
//#define ABC00 

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

而且它可以工作。

但如果我更改为以下:

//#define ABC20 
#define ABC10 
//#define ABC00 

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

当我编译,它得到了错误说ABC10未声明。你们知道为什么吗?

回答

4

使用已定义的测试:

#ifdef ABC20 
    #define SYSTEMNAME      "ABC2" 
#elif defined ABC10 
    #define SYSTEMNAME      "ABC1" 
#elif defined ABC00 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

否则是没有条件的elif来检查,因为后加工前你留下了:

#ifdef 
  #define  SYSTEMNAME                       "ABC2" 
#elif 
  #define  SYSTEMNAME                       "ABC1" 
#elif 
  #define  SYSTEMNAME                       "ABC0" 
#else 
  #define  SYSTEMNAME                       "UNKNOWN" 
#endif 

但只是在defined替换试验用结果如此得到:

#if 0 
    #define SYSTEMNAME      "ABC2" 
#elif 1 
    #define SYSTEMNAME      "ABC1" 
#elif 0 
    #define SYSTEMNAME      "ABC0" 
#else 
    #define SYSTEMNAME      "UNKNOWN" 
#endif 

或者,您可以定义在与true值,标志的休息与假值标志,而不改变测试:

#define ABC20 0 
#define ABC10 1 
#define ABC00 0 
+1

你能解释更多@perreal?我不明白。 TQ。 – Coolguy

+0

我的ABC2 @perreal在哪里? – Coolguy

+0

这就像在C中说else else()一样。你需要一个条件来检查。您也可以将ABC10定义为1以使其工作 – perreal

0

这基本上是因为已经给出了相同的答案,但我尝试从不同的天使解释。

指令#elif#if的“else if”变体。该指令接受一个表达式并检查该值是否为真(即非零)。在这种情况下,表达式中使用的任何变量都应该存在。 (不可否认,C标准认为任何未定义的符号都应该被视为值为0--然而,依赖于这一点被认为是非常糟糕的做法。)

在您的情况下,您正在寻找与“#ifdef”相对应的“else if”变体。

#ifdef ABC20 
#define SYSTEMNAME      "ABC2" 
#elif defined(ABC10) 
#define SYSTEMNAME      "ABC1" 
... 

括号defined后是可选的,但使代码更容易包含在读:这是如下编写的。

0

在你的第一个例子中,你定义了值...没有任何东西...你只能创建它们的定义。 因此,第一个

#ifdef ABC20 

工作...作为ABC20被定义。

然而,当你注释掉该行和ABC20不再定义,你到达

#elif 

这种说法不评估值是否被定义,但看测试的定义本身.. 。这不存在。

试试这个

//#define ABC20 1 
    #define ABC10 1 
    //#define ABC00 1