繁体   English   中英

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

[英]#ifdef doesn't work. But why?

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

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

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

希望有帮助!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM