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

Vol*_*da2 1 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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ani 5

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

请参阅本指南以了解预处理器宏/条件的含义和用途。


[编辑]

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

#define GLOBAL1
#undef GLOBAL1

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

#undef GLOBAL1
Run Code Online (Sandbox Code Playgroud)

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

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

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

// because the pre-processor #undef GLOBAL1
NSLog (@"second");
maxScale = 1.0;
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助!