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

3 回答 3

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
于 2012-11-26T08:22:32.857 回答
0

这与已经给出的答案基本相同,但我尝试从不同的角度解释它。

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

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

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

后面的括号defined是可选的,但包含后会使代码更容易阅读。

于 2012-11-26T08:41:45.350 回答
0

在您的第一个示例中,您定义了值......什么都没有......您只创建它们的定义。因此第一个

    #ifdef ABC20

工作......因为定义了ABC20。

但是,当您注释掉该行并且不再定义 ABC20 时,您会到达

    #elif

该语句不评估是否定义了该值,而是测试定义本身......它不存在。

试试这个

    //#define ABC20 1
    #define   ABC10 1
    //#define   ABC00 1
于 2012-11-26T09:00:05.217 回答