2012-05-28 153 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.