#ifdef 和 #ifndef 的作用

Posted

技术标签:

【中文标题】#ifdef 和 #ifndef 的作用【英文标题】:The role of #ifdef and #ifndef 【发布时间】:2011-04-14 06:18:29 【问题描述】:
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

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

【问题讨论】:

【参考方案1】:

ifdef/endififndef/endif pair 中的文本将根据条件由预处理器保留或删除。 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 为真,ifndef 为假。将它定义为 并不重要。类似(我认为更好)的一段代码是:

#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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

即 if #define one then printf("one 的计算结果为真"); 别的 printf("未定义一个"); 因此,如果没有#define 一个语句,则将执行该语句的 else 分支。

【讨论】:

我不确定这增加了其他答案尚未涵盖的内容,而且您的示例不是 C 或 C++。【参考方案4】:

代码看起来很奇怪,因为 printf 不在任何功能块中。

【讨论】:

整个块可以在函数内部。欢迎来到***。请阅读***.com/help/how-to-answer。

以上是关于#ifdef 和 #ifndef 的作用的主要内容,如果未能解决你的问题,请参考以下文章

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

c语言define用法

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

#if vs #ifndef vs #ifdef

c++#ifndef 的作用,高分在线等,举例!

预处理三剑客(宏定义,文件包含和条件编译)之第三种——条件编译。 #ifndef #ifdef