【问题标题】:Difference between preprocessor directives #if and #ifdef预处理器指令 #if 和 #ifdef 之间的区别
【发布时间】:2011-04-17 17:00:47
【问题描述】:

以下两个预处理器控制语句之间有什么区别(如果有)。

#if

#ifdef

【问题讨论】:

  • 它们不是宏也不是控制语句。他们的名字是“预处理指令”。
  • 已编辑标题。将文本正文中的“控制语句”保留为“模糊”搜索。

标签: c-preprocessor


【解决方案1】:

您可以通过以下方式展示差异:

#define FOO 0
#if FOO
  // won't compile this
#endif
#ifdef FOO
  // will compile this
#endif

#if 检查符号的,而#ifdef 检查符号的存在(无论其值如何)。

【讨论】:

  • +1 明确指出将某些内容定义为零将禁用#if,但不会禁用#ifdef。
  • 如果 FOO 定义的非零值,那么编译器就会编译。为什么?
  • @fahad: #if 检查符号的 以查看它是非零 (true) 还是零 (false)。如果结果为真,则编译该块。
【解决方案2】:
#ifdef FOO

是一个快捷方式:

#if defined(FOO)

#if 也可用于其他测试或更复杂的预处理器条件。

#if defined(FOO) || defined(BAR)

【讨论】:

  • 或我最喜欢的#if 0,而不是评论多行。
  • if (0) 允许在Debug模式下编译行,这样调试的时候可以在块中跳转...
  • @pascal:这听起来高度特定于编译器/环境。 C++ 甚至没有定义调试模式(尽管 NDEBUG 在断言的上下文中有意义)。 ;-P
  • @Tony, pascal:我认为 Pascal 不是在谈论 #if (0) 而是 if (0)。代码不会被执行,但会被编译,即生成指令。如果启用优化(通常在“发布模式”下),则不会生成 CPU 指令。
  • 如果我也能接受你的回答,我也会接受的。改为+1。 :-)
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 2012-09-28
  • 2010-12-15
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
相关资源
最近更新 更多