5

我已经阅读了许多#if 和#define 语句的定义。
我尝试使用我阅读的方式,但仅在将其定义为以下注释的行上出现错误“ Invalid token at start of a preprocessor expression ”:

#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

3 回答 3

5

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

于 2012-05-28T22:57:13.180 回答
1

宏评估发生在编译时。

但是,(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)or[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
  }
}
于 2012-05-28T23:00:19.313 回答
0

同意这里的其他人,尽管我不太精通 C 预处理器,但快速谷歌搜索返回:

expression 是整数类型的 C 表达式,受到严格的限制。它可能包含......比我在源代码中快速实现的格式要好得多

于 2012-05-28T23:02:05.667 回答