以前寫過一篇博客,iOS深刻學習:華麗的#define,列出了一些經常使用的#define。ios
今天再總結一點#define和預處理指令的使用。ide
預處理過程掃描源代碼,對其進行初步的轉換,產生新的源代碼提供給編譯器。可見預處理過程先於編譯器對源代碼進行處理。
學習
預處理指令是以#開頭的代碼行,#後是指令關鍵字,在關鍵字和#號之間容許存在任意個數的空白字符。正行語句構成了一條預處理指令,該指令醬紫啊編譯器進行編譯以前對源代碼作某些轉換,下面是一些經常使用的預處理指令,
spa
# 空指令,沒有任何效果
.net
#include 包含一個源代碼文件orm
#define 定義宏對象
#undef 取消定義宏blog
#if 若是條件爲真,則編譯下面的代碼
get
#elif 若是前面的#if不爲真,則編譯下面的代碼編譯器
#endif 結束一個#if...#elif條件編譯塊
#ifdef 若是已經定義了某個宏,則編譯下面的代碼
#ifndef 若是沒有定義某個宏,則編譯下面的代碼
#error 中止編譯並顯示錯誤信息
最近在看公司本身封裝的sdk的時候,遇到了不少#ifdef和#ifndef,下面我就主要距離來講一說這個預處理指令的靈活使用。好比你如今經過代碼建立了一個Button,
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 100, 40);
[btn setTitle:@"BUTTON" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
可是根據新的需求,這個Button暫時不須要顯示在界面上面,這時候不能夠將該Button相關的代碼註釋掉,這也不失爲一個好方法。可是我更推薦使用預處理指令來進行條件判斷,下面我使用兩種方法來講明,
(1)第一種方法,定義一個具體的宏
#define Debug_ShowButton 0
{
//建立Button對象btn
......//省略若干代碼
#if Debut_ShowButton
//若是須要顯示按鈕,那麼將其添加到父視圖中
[self.view addSubview:btn];
#else
//不將其添加到父視圖中
//[self.view addSubview:btn];
#endif
}
這時候若是想顯示該Button對象,那麼將#define Debug_ShowButton 1,不然寫爲#define Debug_ShowButton 0。
(2)第二種方法,定義一個沒有數值的宏
{
#ifdef Debug_ShowButton
[self.view addSubview:btn];
#endif
}
這段代碼的意思就是若是定義了宏Debug_ShowButton,那麼就將btn添加到父視圖,若是沒有定義的話,那麼不添加到父視圖。這時候若是咱們想要將其添加到父視圖,則在文件的頂部寫上#define Debug_ShowButton,對,這時候咱們能夠不給這個宏指定對應的值,這個代碼僅僅表示定義一個沒有對應值的宏。
總結:
這兩種方法,我更加推薦第二種,由於通常狀況下,咱們定義一個有對應數值的宏,是爲了在代碼中使用該數值,例如#define kStatusBarHieght 20,這樣咱們就能夠把kStatusBarHeight做爲數值在代碼中使用,而第一種方法定義了有對應值的宏Debug_ShowButton,咱們卻沒有在代碼中使用它,這樣是否是有點浪費呢;而使用第二種方法定義一個沒有對應值的宏,它只是一個標識符,看起來簡單點。我我的更加推薦第二種!
本人建了一個ios交流羣188647173,有興趣的能夠加羣進來相互交流。