#define或#if语句错误

时间:2012-05-28 22:50:34

标签: objective-c if-statement c-preprocessor

我已经阅读了#if和#define语句的许多定义 我尝试使用我读取的方式,但只有错误“预处理程序表达式启动时无效的令牌”在将其定义为以下注释的行上:

#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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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
  }
}

答案 2 :(得分:0)

在这里与其他人达成一致虽然我对C预处理器的熟悉程度不高,但是快速的谷歌搜索回来了:

表达式是整数类型的C表达式,受到严格的限制。它可能包含.... 比我在source.

上快速实现的格式要好得多