en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

6.09.2011

前端處理程式 Preprocessor

前端處理程式 Preprocessor 通常會出現在整個程式的最頂端,它們是以 # 字元起頭,最常見的就是在引入檔頭時所使用的 #import 和 在定義常數時所用的 #define。Preprocessor 當然不只這麼簡單,其中還包含了許多學問,如果能善用此技術便能在撰寫程式時更加輕鬆容易,下面我們將介紹一些使用前端處理程式時常見的寫法。

首先從最簡單的 #define 開始,它可以定義出具有自我風格的程式碼,像是在 Objective-C 常用的YES 和 NO 就是這樣被定義出來的,在定義時不需指明型態,只要直接輸入參數值即可,系統會將所有遇到的定義字通通換成此參數。

#define RUNNING 1
if (RUNNING) {
    NSLog(@"Yes, I am running!");
}


在 #define 定義中,可以重新定義運算符號,像是「==」「&&」「||」等。

#define EQUALS ==
if (RUNNING EQUALS 1) {
    NSLog(@"Yes, I am running!");
}


也可以使用被定義的字來定義新的東西,或是使用參數輸入(macro),例如先定義圓周率 PI,接著在使用 PI 定義週長的計算。

#define PI 3.14159
#define CIRCUMFRENCE(radius) (radius) * PI * 2

NSLog(@"%f", PI);
NSLog(@"%f", CIRCUMFRENCE(5));


注意上面程式碼定義的部份,(radius) * PI * 2,radius 必須要有括弧,因為定義的目的只是將定義字換成參數而已,如果不加上括弧當輸入 CIRCUMFRENCE(4+1) 時,則程式碼會被替換成 4+1 * PI * 2,這樣計算結果就會出現錯誤。

最後也可以將整個函式搬到定義中,以上面的程式碼為例,將其製作成定義函式,如下所示。

#define RUN_THIS_DEMO                 \
    if (RUNNING){                     \
        NSLog(@"Yes, I am running!"); \
    }                                 \
    if (RUNNING EQUALS 1) {           \
        NSLog(@"Yes, I am running!"); \
    }                                 \
    NSLog(@"%f", PI);                 \
    NSLog(@"%f", CIRCUMFRENCE(1))

RUN_THIS_DEMO;

定義式中如果需要以多行呈現,則以反斜線作為分行的符號。下列還有一些較常使用的前端處理程式寫法,就不一一示範,有興趣的讀者可以自行實驗。

//解除定義
#undef

//如果該名詞已被定義
#ifdef

//作用同if
#if

//作用同else
#else

//作用同else if
#elif

//標示 #if #ifdef 區塊的結束位置
#endif






沒有留言:

張貼留言