Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 要询问的预处理器语句_C - Fatal编程技术网

C 要询问的预处理器语句

C 要询问的预处理器语句,c,C,我写了如下内容: #define ABC20 //#define ABC10 //#define ABC00 #ifdef ABC20 #define SYSTEMNAME "ABC2" #elif ABC10 #define SYSTEMNAME "ABC1" #elif ABC00 #define SYSTEMNAME "

我写了如下内容:

#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未声明。你们知道为什么吗?

使用定义测试:

#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
但输入定义的
将测试替换为结果,因此您可以得到:

#if   0
  #define  SYSTEMNAME                       "ABC2"
#elif 1
  #define  SYSTEMNAME                       "ABC1"
#elif 0
  #define  SYSTEMNAME                       "ABC0"
#else
  #define  SYSTEMNAME                       "UNKNOWN"
#endif
或者,您可以使用
true
值定义on标志,使用false值定义其余标志,而无需更改测试:

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

这基本上与前面给出的答案相同,但我试图从另一个角度来解释

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

在本例中,您正在寻找对应于“#ifdef”的“else if”变体。全文如下:

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

定义的
后的括号是可选的,但当包含时,代码更容易阅读。

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

    #ifdef ABC20
工作。。。定义为ABC20

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

    #elif
此语句不计算值是否已定义,但查看并测试定义本身。。。这是不存在的

试试这个

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

你能解释得更清楚些吗?我不明白。这就像在C中说
elseif()
,你需要一个条件来检查。您还可以将ABC10定义为1以使其正常工作