#ifdef不起作用。但为什么?

时间:2011-01-14 16:16:22

标签: iphone conditional-compilation

#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。

2 个答案:

答案 0 :(得分:4)

#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

IGNORES 所有其他代码和逻辑。

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

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

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

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

希望有所帮助!

答案 1 :(得分:1)

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