#ifdef和#ifndef的作用

alk*_*dey 94 c-preprocessor

#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
Run Code Online (Sandbox Code Playgroud)

在这个有什么作用#ifdef#ifndef,什么是输出?

pax*_*blo 129

根据条件,预处理器中的一个ifdef/endififndef/endif 一对内的文本将被保留或移除.ifdef意味着"如果以下被定义"而ifndef意味着"如果下面是限定".

所以:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif
Run Code Online (Sandbox Code Playgroud)

相当于:

printf("one is defined ");
Run Code Online (Sandbox Code Playgroud)

因为one定义所以它ifdef是真的而且ifndef是假的.这不要紧,它被定义.一个类似的(在我看来更好)代码片段将是:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif
Run Code Online (Sandbox Code Playgroud)

因为这在这种特定情况下更清楚地指明了意图.

在您的特定情况下,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
Run Code Online (Sandbox Code Playgroud)


Pat*_*ter 64

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

#define one
Run Code Online (Sandbox Code Playgroud)

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

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif
Run Code Online (Sandbox Code Playgroud)

会给one does not evaluate to truth.关键字defined允许获得所需的行为.

#if defined(one) 
Run Code Online (Sandbox Code Playgroud)

因此相当于 #ifdef

#if构造的优点是允许更好地处理代码路径,尝试使用旧#ifdef/ #ifndef对执行类似的操作.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
Run Code Online (Sandbox Code Playgroud)