iOS 中#define和預編譯指令

在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這個關鍵字系統已經用了,咱們就不要搶了,搶的話也會提示重複定義..編譯

相關文章
相關標籤/搜索