【问题标题】:Preprocessor Macro and Boolean in IOS 8 not correctly evaluatedIOS 8 中的预处理器宏和布尔值未正确评估
【发布时间】:2014-09-14 11:35:16
【问题描述】:

结合预处理器宏和布尔值在 IOS8 中被错误地评估

我在带有 IOS 8 的 IPHONE 4 上运行它。代码在 IOS 7 上正常运行

我们是否必须更改代码才能停止使用这些宏?

#define isiPhone4  ([[UIScreen mainScreen] bounds].size.height == 568)?FALSE:TRUE

    BOOL myBool = YES;
    if (myBool || isiPhone4) {
        NSLog(@"TRUE");
    } else {
        NSLog(@"FALSE");
    }

    if (myBool) {
        NSLog(@"TRUE");
    } else {
        NSLog(@"FALSE");
    }

    if (isiPhone4) {
        NSLog(@"TRUE");
    } else {
        NSLog(@"FALSE");
    }

输出 错误的 真的 是的

【问题讨论】:

    标签: ios macros ios8


    【解决方案1】:

    问题出在你的宏上:因为你没有将它括在括号中,在它前面加上一个逻辑表达式可以改变它的含义。

    这是一个非常常见的问题 - 正是在不严格要求宏的情况下(即在大多数情况下)应该避免使用宏的原因。当你的宏展开到位时,Objective-C 编译器会看到这种情况:

    if (myBool || ([[UIScreen mainScreen] bounds].size.height == 568)?FALSE:TRUE) {
        ...
    }
    

    解析如下:

    • 条件:myBool || ([[UIScreen mainScreen] bounds].size.height == 568)
    • 正确:FALSE
    • 假:TRUE

    注意myBoo || 是如何成为条件的一部分的。这是因为 C 优先规则。请记住,当编译器解析表达式时,它并不知道表达式的一部分来自宏,而另一部分在宏扩展之前的代码中。

    以下是您可以解决的方法:

    #define isiPhone4  (([[UIScreen mainScreen] bounds].size.height == 568)?FALSE:TRUE)
    

    【讨论】:

    • 感谢您的快速答复。你说的很对,为什么这只是IOS 8的问题?
    • @RyanHeitner 它与操作系统无关。我在 iOS 7.1 上尝试过,得到了相同的输出。
    • 这是我的 IOS 7 中的另一个问题 - 这仅适用于 IOS8 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多