【问题标题】:#ifdef doesn't work. But why?#ifdef 不起作用。但为什么?
【发布时间】:2011-06-09 06:06:45
【问题描述】:
#ifdef doesn't work. But why? 

CGFloat maxScale;

if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
    NSLog (@"case1");
#define GLOBAL1
}
else 
{
    NSLog (@"case2");
#undef GLOBAL1
}

#ifdef GLOBAL1
NSLog (@"first");
maxScale = 1.0 / [[UIScreen mainScreen] scale];
#else
NSLog (@"second");
maxScale = 1.0;
#endif

#undef GLOBAL1

我的日志:case1,第二个。但首先必须是case1。

【问题讨论】:

  • 可能希望修复您的格式。将使其更易于阅读。
  • 正确发布代码。不可读。

标签: iphone conditional-compilation


【解决方案1】:

#define、#ifdef 是预处理器宏/条件。这意味着它们中包含的逻辑是在编译代码之前编译的。它实际上不是您的代码的一部分。

See this guide for learning what pre-processor macros/conditionals are and do.


[编辑]

这是您的预处理器在读取您的代码时看到的内容。

#define GLOBAL1
#undef GLOBAL1

#ifdef GLOBAL1
   //...
#else
   //...
#endif

#undef GLOBAL1

它忽略所有其他代码和逻辑。

这是编译器生成的实际代码输出:

if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
    NSLog (@"case1");
}
else 
{
    NSLog (@"case2");
}

// because the pre-processor #undef GLOBAL1
NSLog (@"second");
maxScale = 1.0;

预处理器代码被“执行”,告诉编译器如何编译,并且在运行时不会被使用或运行。

希望有帮助!

【讨论】:

    【解决方案2】:

    预处理器不关心 #define 是否在编码的 if 语句中 - 它在代码之前处理,只关心其他预处理器定义。您不能将#defines 和其他预处理器命令(例如#undef)用作代码——它们不会在每次代码进入条件分支时被命中。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 2014-01-26
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2020-04-05
      相关资源
      最近更新 更多