前端處理程式 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
沒有留言:
張貼留言