2012-10-04 109 views
4

下面的代碼產生輸出「yes defined」,「no defined」和「yes」。爲什麼?預處理器宏和BOOL奇怪

#define FOOBAR NO 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
#ifdef YES 
    NSLog(@"yes defined"); 
#endif 

#ifdef NO 
    NSLog(@"no defined"); 
#endif 

#if FOOBAR == YES 
    NSLog(@"yes"); 
#else 
    NSLog(@"no"); 
#endif 
    // ... 
} 

YES和NO都沒有定義,objc.h將它們定義爲:

typedef signed char  BOOL; 
#define YES    (BOOL)1 
#define NO    (BOOL)0 
+0

編譯器bug ...? – 2012-10-04 10:09:24

回答

4

什麼是NO價值?如果它未定義(如YES),則它們都將是​​。

這意味着你的表達基本上是

#if 0 == 0 

這當然是正確的,從而使要編譯的第一個呼叫。

更新:不知道如何定義BOOL,但在處理預處理器時,轉換爲可能是typedef:ed類型不是一個好主意。請記住,#if由預處理器評估,而不是由編譯器評估。有關預處理器中表達式的更多信息,請閱讀this之類的內容。尤其是:

預處理程序不知道語言中的類型。

+0

但爲什麼YES等於0?它是1 –

+1

預處理程序不理解類型的點似乎是我的答案。預處理器可以將'0'與'1'進行比較,但不能用'(BOOL)1'對'(BOOL)0'進行比較。 – ugoren

4

預處理程序不知道的所有標識符均被替換爲0以用於#if指令中的評估。如果您沒有定義YESNO,則兩者均爲0(因此相等)。