#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
这是#ifdef
和#ifndef
的作用是什么,输出是什么?
答案 0 :(得分:117)
ifdef/endif
或ifndef/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不在任何功能块中。