2011-12-28 346 views
4

是否可以在「if」語句中使用#define?下面的代碼有效,但我得到一個警告,說這個宏正在被重新定義。在「if」語句中使用#define

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
#define TableViewHeight 916 
#define DisplayHeight 1024 
#define DisplayWidth 768 
} 
else { 
#define TableViewHeight 374 
#define DisplayHeight 480 
#define DisplayWidth 320 
} 

我也嘗試過這一點,但沒有奏效:

#ifdef UIUserInterfaceIdiomPad 
#define TableViewHeight 916 
#define DisplayHeight 1024 
#define DisplayWidth 768 
#else 
#define TableViewHeight 374 
#define DisplayHeight 480 
#define DisplayWidth 320 
#endif 

任何想法?

+1

海事組織,這不是什麼常量的建立。 – surfasb 2011-12-28 22:21:42

回答

7

是的,這是可能的,但它可能不會做你的想法。編譯預處理步驟的結果之前解釋預處理器指令。

這意味着所有的預處理器指令都被解釋,重新定義一些宏,然後編譯剩餘的代碼,看起來像下面的代碼。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
} 
else { 
} 

換句話說,預處理後,你就必須空ifelse機構。

如果您想要在運行時根據條件更改某個值的值,那麼某些東西必須是真正的對象,而不僅僅是預處理器宏。例如。

extern int TableViewHeight; // defined somewhere else 
extern int DisplayHeight; // defined somewhere else 
extern int DisplayWidth; // defined somewhere else 

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    TableViewHeight = 916; 
    DisplayHeight = 1024; 
    DisplayWidth = 768; 
} 
else { 
    TableViewHeight = 374; 
    DisplayHeight = 480; 
    DisplayWidth = 320; 
} 
+0

嗯,downvoted。我錯過了什麼嗎? – 2011-12-28 22:29:10

+1

所有四個答案都是事實正確的,但這是唯一真正解釋正確方法的答案。 – Chuck 2011-12-28 22:29:23

1

#define(和#ifdef等)由預處理器處理。這個運行完全是之前的編譯器本身;他們實際上是兩個完全獨立的過程。所以它根本不與像if這樣的結構相互作用。

如果UIUserInterfaceIdiomPad是宏(即它的編號爲#defined),則您的第二個代碼示例可能有效。

0

使用#if而不是正常的if

然而這將是一個預處理器的東西,這意味着你的應用程序只能編譯爲iPhone或iPad(如果它工作的話)。

底線:不,你不能使用宏。在編譯時檢查它們,而不是在運行應用程序時檢查。

0

不幸的是, #define由預處理器用於在代碼編譯之前替換符號,而if是要編譯的實際代碼的一部分。在第一種情況下,預處理器不知道你的if語句的結果是什麼。

第二種情況沒有意義,因爲您不在乎是否定義了UIUserInterfaceIdiomPad ,您關心UI_USER_INTERFACE_IDIOM()是否具有該值。

1

我想你回答了你自己的問題:)但是,爲了除去警告,爲什麼不把它們聲明爲變量而不是宏呢?

我這樣做:

CGFloat tableHeight = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 916.0f : 374.0f; 
1

#defines被編譯器運行之前的預處理器取代。這意味着您無法在運行時設置它們的值。我可以做你要什麼的方法是這樣的:在.m文件(類實現)

static CGFloat TableViewHeight; 
static CGFloat DisplayHeight; 
static CGFloat DisplayWidth; 

在您的.h文件中

+ (void)initialize 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    TableViewHeight = 916.0; 
    DisplayHeight = 1024.0; 
    DisplayWidth = 768.0; 
    } else { 
    TableViewHeight = 374.0; 
    DisplayHeight = 480.0; 
    DisplayWidth = 320.0; 
    } 
} 

或者,你可以這樣做:

#define TableViewHeight ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 916.0 : 374.0) 
#define DisplayHeight ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 1024.0 : 480.0) 
#define DisplayWidth ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 768.0 : 320.0) 

最後,對於DisplayHeight和DisplayWidth,你不要r最終需要做到這一點,並可能更好使用CGRectGetHeight([[UIScreen mainScreen] bounds])CGRectGetWidth([[UIScreen mainScreen] bounds])