#ifdef和#ifndef的作用

时间:2010-09-19 05:21:19

标签: c-preprocessor

#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

这是#ifdef#ifndef的作用是什么,输出是什么?

4 个答案:

答案 0 :(得分:117)

ifdef/endififndef/endif 内的文字将由预处理器保留或删除,具体取决于条件。 ifdef表示“如果定义了以下内容”,而ifndef表示“如果以下已定义”。

所以:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

相当于:

printf("one is defined ");

由于one已定义,因此ifdef为true且ifndef为false。将定义为并不重要。与我相似的代码(在我看来更好)是:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

因为在这种特殊情况下,它更明确地指明了意图。

在您的特定情况下,ifdef之后的文字未被删除,因为one已定义。出于同样原因删除ifndef 的文本。在某些时候需要有两个关闭endif行,第一行将导致行再次被包含,如下所示:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif

答案 1 :(得分:59)

有人应该提一下,问题中有一点陷阱。 #ifdef仅检查是否已通过#define或命令行定义了以下符号,但其值(实际上是替换)无关紧要。你甚至可以写

#define one

预编译器接受了。 但是,如果你使用#if,这是另一回事。

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

将提供one does not evaluate to truth。关键字defined允许获得所需的行为。

#if defined(one) 
因此,

相当于#ifdef

#if构造的优势在于可以更好地处理代码路径,尝试使用旧#ifdef / #ifndef对进行类似的操作。

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300

答案 2 :(得分:0)

" #if one"意味着如果" #define one"已被写成" #if one"否则执行" #ifndef one"被执行。

这只是C语言中的if,then,else分支语句的C预处理器(CPP)指令。

即。 如果{#define one}则printf("一个评估真相"); 其他 printf("一个未定义"); 所以如果没有#define一个语句,那么语句的else分支就会被执行。

答案 3 :(得分:-1)

代码看起来很奇怪,因为printf不在任何功能块中。