比较#define给出错误的结果

时间:2013-12-09 14:58:33

标签: ios objective-c c-preprocessor

我已经定义了一个变量,它给出了如下输出。

iPhone 4 >> 4
iPhone 5 >> 5
iPad >> 999

使用的功能如下。

#define iPhone4Or5 [[UIScreen mainScreen] bounds].size.height == 568 ? 5 :
        ([[UIScreen mainScreen] bounds].size.height == 480 ? 4 : 999)

当我使用NSLog变量iPhone4Or5时,它为iPhone 5提供了正确的结果,但是当我进行比较时,它给出了错误的结果......

if (iPhone4Or5==999) {
    NSLog("Its iPad version");
} else {
    NSLog("Its iPhone version");
}

当我在iPhone 5或更高版本上面运行时,它总是给我NSLog作为它的iPad版本

我知道为什么我会得到错误比较结果?

我在prefix.pch

中定义变量

注意:

如果我执行NSLog("iPhone4Or5==%d", iPhone4Or5),我的输出为iPhone4Or5==5

2 个答案:

答案 0 :(得分:0)

您遇到运算符优先级问题 - 您的宏需要括号:

#define iPhone4Or5 ([[UIScreen mainScreen] bounds].size.height == 568 ? 5 : \
        ([[UIScreen mainScreen] bounds].size.height == 480 ? 4 : 999))

更好的是,避免这个和其他常见的宏相关问题并改为使用函数:

int iPhone4Or5(void)
{
    const int height = [[UIScreen mainScreen] bounds].size.height;
    if (height == 568) return 5;
    if (height == 480) return 4;
    return 999;
}

答案 1 :(得分:0)

记录[UIScreen mainScreen] bounds].size.height的值并检查它是否为480。

或者你可以使用这些。

#define IS_IPAD ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 

#define IS_IPHONE5 ((( !IS_IPAD && [[UIScreen mainScreen] bounds].size.height == 568))?YES:NO)