2013-04-26 95 views
41

使用編譯器指令時,我不清楚以下兩個代碼片段中的哪一個是正確的/首選的以及爲什麼。看來,我見過的大多數開發人員和開源項目都使用第一個,但我也看到了第二個頻繁使用的項目。#ifdef調試與#if調試

#ifdef DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

VERSUS

#if DEBUG 
[self doSomethingOnlyWhenDebugging]; 
#endif 

這上面的代碼片段的最好運行代碼只在調試時,爲什麼?我的猜測是,如果DEBUG被定義爲TRUE或FALSE,第一個將運行,其中第二個只有在DEBUG被定義並設置爲TRUE時纔會運行。那是對的嗎?

+9

'#ifdef'只是測試符號是否已被定義。'#if'測試符號的VALUE。所以'#define FOO 0'將使'#ifdef FOO'爲真,但'#if FOO'爲假,因爲它正在執行'#if 0'。 – 2013-04-26 21:43:46

+0

您應該嘗試查找「根」定義並確定該值是打算成爲1/0值還是當前/不存在的值。讓他們錯誤可能會產生「意想不到的」後果。 – 2013-04-26 21:47:14

回答

35

你是對的。 #if DEBUG將不會評估是否DEBUG被定義爲0

至於何時使用的,你可以堅持使用#ifdef任何東西,你只需要添加代碼當預處理器的定義存在,如增加調試日誌記錄。如果您需要檢查該值並沿着不同的編譯路徑行進,那麼我將使用01。一個很好的例子是TARGET_IPHONE_SIMULATOR,它總是爲iOS項目定義的,但如果您正在編譯模擬器,則只能使用1

+1

因此,如果我只想在模擬器中執行某行代碼,那麼我需要使用'#if',因爲無論我是否在模擬器上運行,都定義了TARGET_IPHONE_SIMULATOR。正確? – lidsinker 2013-04-26 21:49:51

+2

@lidsinker正確 – Kevin 2013-04-26 21:53:48

+0

很好地解釋。非常感謝 – 2014-09-09 10:49:06

6

據我所知,最好的選擇是:

#ifndef DEBUG 
    NSLog(@"-1"); 
#elif DEBUG == 0 
    NSLog(@"0"); 
#else 
    NSLog(@"%d", DEBUG); 
#endif 

那麼,你就會知道#ifndef DEBUG最好高於一切。 還有一個更簡單的選擇:

#if DEBUG == 0 // DEBUG is not defined or defined to be 0 
    // do sth 
#else 
    // do sth 
#endif 

但是,如果-Wundef編譯器標誌是,有可能是一個警告#if DEBUG == 0

1

您需要查看DEBUG定義或未定義的代碼,並相應地編寫代碼。用DEBUG,你會發現它沒有定義,或者定義值爲1.因此,無論是#if DEBUG還是#ifdef DEBUG都可以工作。

對於您所控制的#define,我建議您始終使用值0或1來定義它們。然後可以使用#if檢查值,但也可以直接使用它們普通的if語句或表達式,這可能會使您的代碼更具可讀性。由於它總是被定義的,你可以使用Xcode中的「跳轉到定義」去它定義的地方,並檢查它的設置方式和原因。如果你的代碼是#define或者#define這個值,並且它沒有被定義,那麼Xcode將不知道你的源代碼中沒有定義它的位置。它也讓你有機會尋找拼寫錯誤的用途。如果「跳轉到定義」不起作用,那麼你知道你拼錯了。

BTW在一個#if的指令,一個沒有被定義爲替換爲0。所以#if DEBUG會工作,如果DEBUG沒有定義,或者如果DEBUG被定義爲0,如果DEBUG被定義,因爲它不會編譯任何宏什麼也沒有 - 這會告訴你什麼是錯的,所以你可以修復它。從這個角度來看,使用#if更好,除非它不編譯。