#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。
答案 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
)作为代码 - 每次代码进入条件分支时都不会命中它们。