#ifdef 和 #ifndef 的作用

2024-02-16

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

在这其中的作用是什么#ifdef and #ifndef,输出是什么?


里面的文字ifdef/endif or ifndef/endif pair将根据情况被预处理器保留或删除。ifdef表示“如果定义了以下内容”,而ifndef意思是“如果以下是not定义”。

So:

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

相当于:

printf("one is defined ");

since one被定义为ifdef是真的,并且ifndef是假的。它的定义是什么并不重要as。一段类似的(我认为更好)代码是:

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

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

在您的特定情况下,后面的文本ifdef没有被删除,因为one被定义为。后面的文字是ifndef is出于同样的原因被删除。需要有两次关闭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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#ifdef 和 #ifndef 的作用 的相关文章

  • C语言中的宏(#define)

    我正在阅读hoard内存分配器的源代码 在gnuwrapper cpp文件中 有以下代码 define CUSTOM MALLOC x CUSTOM PREFIX malloc x 是什么意思CUSTOM PREFIX malloc x i
  • 可以在 VS2008 中的预处理器指令块(例如 #ifndef ... #endif)中启用智能感知吗?

    在 C 库中工作时 我注意到在 ifndef CLIENT DLL endif 等指令块内我没有被授予任何智能感知 这显然是由于 CLIENT DLL 已被定义的事实 我意识到我可以通过简单地注释掉指令来解决这个问题 无论指令评估如何 是否
  • 在 C 预处理器中,“#”字符是否必须位于行的开头? [复制]

    这个问题在这里已经有答案了 我已经用 C 语言编程有一段时间了 在此期间 我了解到将预处理器指令之前的 字符放在第一列是一种常见的约定 Example include
  • 当指定 -g 时,gcc 会定义什么吗?

    很快 我想知道 gcc 或 g 我需要它C 但也对 c 感到好奇 定义了任何特殊符号 如果 g已启用 可以 如果是的话 是什么符号 在搜索过程中我发现 DEBUG是手动定义的 手动我的意思是 D DEBUG 并且是 Visual C 程序员
  • 如何定义预处理器宏来检查iOS版本

    我用它来检查iOS版本 但它不起作用 ifndef kCFCoreFoundationVersionNumber iPhoneOS 5 0 define kCFCoreFoundationVersionNumber iPhoneOS 5 0
  • C 中的“with”宏

    我一直在寻找一个类似于 with 结构的宏 用法应该是这样的 with lock x unlock x 它可能对其他一些目的有用 我想出了这个宏 define with onenter onexit v for int with uniq
  • 宏观评估顺序[重复]

    这个问题在这里已经有答案了 可能的重复 宏中的 和 https stackoverflow com questions 4364971 and in macros 为什么第二个 printf 的输出是 f 1 2 宏的计算顺序是什么 inc
  • 你能在 C 中#define 注释吗?

    我正在尝试做一个调试系统 但它似乎不起作用 我想要完成的是这样的 ifndef DEBUG define printd else define printd printf endif 有没有办法做到这一点 我有很多调试消息 但我不喜欢这样做
  • #define 导致“预期的主表达式”错误

    define N 10 int main int x for int i 0 i
  • 编译时检查函数是否使用/未使用 C++

    我想在编译时检查是否有某些函数某堂课使用 未使用 相应地使编译过程失败 通过 例如如果函数F1在代码中的某处调用我希望编译成功 并且 if 函数F2称为我希望它失败 关于如何使用预处理器 模板或任何其他 C 元编程技术来做到这一点 有什么想
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • C/C++ 代码的预处理器指令 #ifndef

    在 Eclipse 中 每当我创建一个新的 C 类 或者C头文件中 我得到以下类型的结构 假设我创建头文件 example h 我得到 Comments ifndef EXAMPLE H define EXAMPLE H Place to
  • #elif 定义时不带括号

    使用 VS2005 和 BLAH BLAH 定义以下预处理器条件为 false elif defined BLAH BLAH 但如果我把它改成 elif defined BLAH BLAH 是真的 为什么括号在这里会有所不同 它应该没有任何
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • C 预处理器宏不解析逗号分隔的标记?

    我想根据参数的数量选择两个函数之一 nargs 0 gt f1 nargs gt 0 gt f2 宏执行以下操作 获取第一个参数 如果没有提供参数 则会添加两个逗号 NULL NULL 然后它会从返回的参数列表中选择第二个参数 例如 f H
  • C 预处理器中的宏评估

    我想做这样的事情 define NUM ARGS 2 define MYMACRO0 no args define MYMACRO1 one arg define MYMACRO2 two args define MYMACRO num M
  • “#define for if (false) {} else for”的可能用途是什么?

    在另一个问题中 我刚刚发现了这个小珍珠C wisdom define for if false else for 这导致 MSVC 对于一个相当有效的语句发出 常量表达式 警告 for int i 0 i lt 10 i 我明白whyMSV
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • cpp 和 gcc -E 的区别

    我以为两者cpp foo c and gcc E foo c以相同的方式预处理源文件 但是对于同一文件 我得到的输出有所不同 cat foo c define VARIABLE 3 define PASTER x y x y define

随机推荐