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

4

2 回答 2

4

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

请参阅本指南以了解预处理器宏/条件是什么以及做什么。


[编辑]

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

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

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

希望有帮助!

于 2011-01-14T16:20:00.530 回答
1

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

于 2011-01-14T16:23:12.947 回答