2015-11-07 41 views
1

如果我創建一個項目的目標與價值1Debug配置命名DEBUG預處理宏,而不是爲Release配置,我發現,使用#if預處理宏是否正在運行#ifdef在Objective-C的幕後?

#if DEBUG 
... 
#endif 

編譯爲Release建立了。

首先,檢查DEBUG是否定義以及是否在之後,如果它評估爲true?如果是,是否可以(或建議)以這種方式使用它而不是

#ifdef DEBUG 
    #if DEBUG 
    ... 
    #endif 
#endif 

+0

'#if DEBUG'只應該是'DEBUG'被定義並且它有一個非零值。 – rmaddy

回答

1

不建議使用#if VARIABLE而不檢查已定義VARIABLE

#if計算表達式,它執行以下操作:(這意味着其尚未#define d的符號將保持不變)

  1. 它擴展在表達的所有宏

  2. 它解析結果作爲一個整數算術表達式中,用整數0

所以更換任何標識符如果DEBUG尚未#define d爲宏,

#if DEBUG 

將相同

#if 0 

其也將具有#ifdef DEBUG相同的效果。

如果定義DEBUG-DDEBUG命令行,然後有一個隱含的

#define DEBUG 1 

之前的文件進行預處理,其結果是

#if DEBUG 

相同

#if 1 

這也與相同。

但是。如果你做了以下內容:

#define DEBUG 
#if DEBUG 
// ... stuff 
#endif 

的該#if將擴大到:

#if 

,你會得到一個錯誤信息:

file.m:2:6: error: #if with no expression 

結果,這是不明智的使用#if VARIABLE,除非您確定VARIABLE已被定義爲整數。

+0

哇,非常感謝您的詳細解答!但是,正如@Jody Hagins提到的那樣,默認情況下,Xcode爲'Debug'配置提供了預處理器宏DEBUG = 1,而'Release configuration'則沒有。那麼,對於這種情況,使用'#if DEBUG'而不是'#ifdef DEBUG'仍然是錯誤的嗎? –

+0

@IulianOnofrei:總的來說,最好使用'#ifdef DEBUG'。在XCode上它可能沒有什麼區別,但總有一天你可能想在不同的環境下編譯代碼。 – rici

1

當在調試模式下構建時,Modern Xcode已經爲DEBUG提供了一個定義。

enter image description here

#ifdef DEBUG#if DEBUG之間的區別是,當符號被定義,不管已經定義了什麼價值#ifdef DEBUG將是真實的。

因此,#define DEBUG=0對於#ifdef DEBUG將爲真,因爲它有一個定義的值(對於#define DEBUG出於同樣的原因也是如此)。

但是,#if DEBUG只有在DEBUG已定義爲非零值時才爲真。

+0

我想說的是,但我不確定它是否確實是默認行爲,或者項目上的以前的開發人員添加了它。 –

+0

所以簡短的答案是'是',它確實檢查宏是否已定義,如果沒有像我想的那樣定義它,它不會崩潰構建,對吧? –

+0

'#if DEBUG'只會在'DEBUG'沒有定義或者其值爲零時返回'false'。如果沒有定義,它不會崩潰。 – rmaddy