- Objective-C和Sprite Kit游戲開發從入門到精通
- 曹化宇
- 895字
- 2021-01-07 18:57:40
2.16 預處理
前面的內容中,我們已經多次看到預處理的使用,如#define、#ifndef、#endif等指令,它們以行為單位,而且結尾沒有分號,這是預處理和代碼最大的區別之一。
下面,我們將會對常用的預處理指令做一些總結,主要包括:
? #define和#undef指令。
? 條件編譯指令。
? #import指令。
■2.16.1 #define和#undef指令
#define指令的功能就是定義宏,我們可以定義很簡單的宏,簡單到只有一個標識名稱,如下面的代碼。
#define DEBUG
這樣,就可以根據是否定義了這個宏來判斷項目是在調試中,還是正式發布了,我們可以使用#ifdef指令判斷一個宏是否已定義,而使用#ifndef指令判斷一個宏是否沒有定義。
使用#define指令定義的宏,可以使用#undef指令撤消,如下面的代碼。
#undef DEBUG
#define指令的另一個功能就是模擬定義常量,如下面的代碼。
#define DT_IPHONE4 4 #define DT_IPHONE5 5 #define DT_IPAD 1000
此外,我們還可以利用#define定義一些復雜的宏,如下面的代碼。
#define IsEvenNumber(n) (n % 2 == 0)
其中,我們定義了IsEvenNumber宏,其功能是判斷一個數是否為偶數,它使用起來和函數類似,如下面的代碼。
int num = 100; if (IsEnenNumber(num)) { NSLog(@"%i是偶數", num); }else{ NSLog(@"%i不是偶數", num); }
此外,如果一個#define指令的定義過長,我們可以將它們分行,但需要使用“\”符號放在前一行的結尾處,用以說明下一行與本行是同一指令。
■2.16.2 條件編譯指令
通過定義宏,還可以指定在不同的條件下編譯不同的代碼,此時,我們可以使用#define定義一些與系統平臺相關的標識,然后根據這些標識將軟件編譯成不同的版本。與條件編譯相關的指令包括:
? #ifdef指令,判斷一個宏標識是否已定義。
? #ifndef指令,判斷一個宏標識是否沒有定義。
? #endif指令,與#ifdef或#ifndef指令組成一個代碼塊。
? #elif和#else指令,一般與#ifdef和#endif指令組合使用,以判斷不同條件下的代碼執行情況。
如下面的代碼,將根據不同的設備類型來編譯相應的代碼。
#define IPhone #ifdef IPhone // iPhone設備代碼 #elif IPad // iPad設備代碼 #else // 其他類型設備代碼 #endif
此外,在頭文件中,如前面我們定義的CApp.h文件,其中使用了一個模式化的預處理代碼,我們再來看一看。
#ifndef __CApp_h__ #define __CApp_h__ #endif
這三個預處理指令的功能是在代碼文件中防止多次包含頭文件,以提高代碼的編譯效率。
■2.16.3 #import指令
#import指令的功能就是引用頭文件,我們已經多次使用,再次說明一下:
? 使用一對尖括號<>引用的頭文件是系統資源,如Foundation.h文件。
? 使用一對雙引號""引用的頭文件是“外部”資源,可能是第三方框架或自定義的頭文件。