#ifdef和#ifndef的作用

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

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

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 "); 

因为定义了一个ifdef是真的, ifndef是假的。 不pipe它被定义为什么。 类似(更好的是我的观点)这段代码将是:

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

因为这在这个特定的情况下更明确地expression了意图。

在你的具体情况下, ifdef之后的文本不会被删除,因为定义了one 。 由于相同的原因, ifndef之后的文本删除。 在某一点需要有两条closures的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 

有人应该提到,在这个问题上有一个小陷阱。 #ifdef只会检查是否通过#define或命令行定义了下面的符号,但是它的值(实际上它的replace)是不相关的。 你甚至可以写

 #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 truthdefined的关键字允许获得所需的行为。

 #if defined(one) 

因此相当于#ifdef

#if构造的优点是允许更好地处理代码path,尝试使用旧的#ifdef / #ifndef对来做类似的事情。

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

“#if one”表示如果“#define one”被写入“#if one”,否则执行“#ifndef one”。

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

即如果{#define one}然后printf(“一个评估真相”); 其他printf(“一个没有定义”); 所以如果没有#define one语句,那么语句的else分支将被执行。