官术网_书友最值得收藏!

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文件。

? 使用一對雙引號""引用的頭文件是“外部”資源,可能是第三方框架或自定義的頭文件。

主站蜘蛛池模板: 益阳市| 闵行区| 太康县| 乐至县| 应城市| 金华市| 合作市| 乌兰察布市| 枞阳县| 柳河县| 新丰县| 沽源县| 沙田区| 治县。| 中卫市| 密山市| 民权县| 班玛县| 秀山| 绍兴县| 光泽县| 自治县| 渑池县| 武定县| 台南市| 门源| 盐山县| 霍林郭勒市| 赫章县| 宾川县| 彝良县| 那坡县| 红安县| 乳山市| 石门县| 塔河县| 沽源县| 呼伦贝尔市| 富川| 青神县| 泸水县|