2012-05-28 155 views
5

我已阅读#if和#define语句的许多定义。
我试图用我的阅读方式,但只与错误就行了,它定义了如下评论“在预处理表达开始无效令牌”:#define或#if语句错误

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

#define is_ipad   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define is_ipad_hd  ((is_ipad == 1 && [UIScreen mainScreen].bounds.size.width > 1024) ? YES : NO) 
#define is_iphone_hd ([UIScreen mainScreen].bounds.size.width > 480 ? YES : NO) 
#define device_width 480.0f 
#define device_height 320.0f 

#if (is_ipad_hd == YES) // Error here 
    #define device_width  = 2048.0f 
    #define device_height  = 1496.0f 
#endif 

为什么它在简单的教程,当我们尝试更复杂的事情时,会发生这些事情!

+4

预编译指令在编译之前进行评估;很显然,他们无法运行运行时信息。 (我不知道Objective C,但'[UIScreen mainScreen] .bounds.size.width'听起来像是一个运行时的事情...) –

+0

好吧,现在我明白了。 那么如何指定设备的屏幕尺寸? 对不起,我的慢,因为一些英文研究技术很难翻译,看起来应该是我想象的方式。 –

回答

4

这些是预处理指令,因此您无法访问编译时定义的[UIScreen mainScreen]方法和所有其他对象!

1

宏观评估发生在编译时。

但是,(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)[UIScreen mainScreen]只能在运行时解释。

除此之外,你不应该依靠屏幕大小来为你做你的肮脏的工作。你应该改为依赖于用户界面成语和主屏幕的规模:

BOOL isiPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; 
BOOL isHD = [[UIScreen mainScreen] scale] == 2.0; 

if (isiPad) { 
    if (isHD) { 
    // retina iPad 
    } else { 
    // non-retina iPad 
    } 
} else { 
    if (isHD) { 
    // retina iPhone/iPod touch 
    } else { 
    // non-retina iPhone/iPod touch 
    } 
} 
+0

所以我想设置一次,所以我想使用#define和#if。 那么我不知道是否可以使用一个简单的标题,作为你的例子,并在每个场景中处理。 如果这是我说的正确的话。 谢谢 –

+0

我遵循了你的建议,但在任何时候都不会错误地检查和设置变量吗? 有一个更简单的方法? –

0

与他人同意在这里虽然我在C预处理不是深谙一个快速谷歌上搜索这个回来:

表达式是整数类型的C表达式,受到严格限制。它可能包含... 格式比我在这里可以快速实现的要好得多source.