#ifdef和#ifndef的作用


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

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

Answers:


131

预处理程序将根据情况保留或删除一对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已定义,所以ifdeftrue为true,ifndeffalse为false。定义没关系。与此类似(在我看来更好)的代码片段是:

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

因为这样可以更明确地说明在这种特定情况下的意图。

在您的特定情况下,ifdefone定义后,不会删除后面的文本。后的文本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

68

有人应该提到这个问题有一个陷阱。#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

0

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

这仅仅是C预处理程序(CPP)指令,等同于C语言中的if,then,else分支语句。

例如,如果{#define一个},则printf(“一个结果为真”); 否则printf(“一个未定义的”); 因此,如果没有#define一个语句,则将执行该语句的else分支。


4
我不确定其他答案还没有涵盖什么,而您的示例不是C或C ++。
SirGuy 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.