在iOS開發的過程當中,常常會遇到以下的代碼 :ui
#ifdef DEBUG # define DLog(fmt, ...) NSLog((@"^ %s line %d " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); #else # define DLog(...) #endif
這是一個打印語句,用於調試程序,但是#ifdef這些都是什麼鬼???#ifdef就是預處理指令。debug
預處理指令以#開頭,#後是關鍵字,#和關鍵字之間容許有任意個空白字符。經常使用的預處理指令:調試
# 空指令,沒有任何效果 #include 包含一個源代碼文件 #define 定義宏 #undef 取消定義宏 #if 若是條件爲真,則編譯下面的代碼 #elif 若是前面的#if不爲真,則編譯下面的代碼 #endif 結束一個#if...#elif條件編譯塊 #ifdef 若是已經定義了某個宏,則編譯下面的代碼 #ifndef 若是沒有定義某個宏,則編譯下面的代碼 #error 中止編譯並顯示錯誤信息
如今來看上邊的打印語句的意思就是若是定義了 DEBUG 這個宏的話,日誌
# define DLog(fmt, ...) NSLog((@"^ %s line %d " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
這個宏定義纔會有做用。但是咱們並無在工程裏邊提供 DEBUG 這個宏定義啊,可是程序仍是能夠打印日誌,這不科學啊。code
然而,打印 DEBUG的話能夠獲得它的值 爲 1,說明是定義過的,但是在哪裏定義了..開發
在 "Target > Build Settings > Preprocessor Macros > Debug" 裏有一個"DEBUG=1"。get
當咱們Run, Test, Analyze時,就屬於debug mode,當Profile, Archive時就屬於release mode。在XCode的"Edit Scheme..."能夠切換。it
能夠DEBUG這個關鍵字系統已經用了,咱們就不要搶了,搶的話也會提示重複定義..編譯