Answers:
预处理程序将根据情况保留或删除一对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为true,ifndef
false为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
有人应该提到这个问题有一个陷阱。#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
该代码看起来很奇怪,因为printf不在任何功能块中。