#define 最常見的用法是指定一個符號名稱(symbolic name)給程式中的常數,
ex.
#define PI 3.1415926
定義符號名稱 PI,並讓它等同於 3.14。
在程式中只要出現 PI 的地方,前端處理程式會自動將 PI 取代為定義 3.14。
#define 敘述有個特殊的語法:將 3.14 指定給 PI 時,不會用到等號,在句尾也沒有分號。(稍後說明)
#define 敘述通常宣告在程式的一開始處,且位於 #import or #include 敘述之後,
放置的位置沒有硬性規定,但一定要置於程式被引用前。
大部份的程式設計師會將 #define 敘述置於標頭檔,如此名稱便能被多個原始檔(source file)使用。
使用 #define 敘述的好處是:
1. 我們不必在每次需要用到常數時,記得該常數值。
2. 若要修改該常數,只要在 #define 敘述裡修改即可。
若不用這個方法,則需要搜尋整個程式,並且在每個使用該常數的地方加以修改。
命名習慣:
一般程式設計師習慣將符號名稱以大寫表示,
ex.
#define PI 3.14#define TRUE 1
#define FALSE 0
這是為了要與變數的定義作區隔,如此便能輕易的分辨,一個名稱代表的是物件、class name、或是 symbolic name。
也有個通俗的習慣,使用 k 作為定義的前置詞,在此情況,命名就不需要全大寫,
ex.
#define kMaximumValue 100
#define kMiniimumValue 1
進階的形態定義:
符號名稱的定義不只限於一個常數,還可以包含一個運算式,
ex.
#define TWO_PI 2.0 * 3.1415926
前端處理程式將置換所有出現的符號名稱,這也就是為什麼不以分號做結束的原因。
若用了分號會變成:
#define PI 3.1415926;
return 2.0 * PI * r;
編譯器看到的是:
return 2.0 * 3.1415926; * r;
而造成語法上的錯誤,
所以請記得不要在 #define 敘述字尾加上分號,除非確定分號就是敘述的一部份。
對前端處理程式定義來說,只要代替的運算式是有效即可。
ex.
#define AND &&
#define OR ||
便可撰寫以下程式:
if (x == 0 OR x == value) { //...
}
甚至也可將 #define 用在相等的比較
#define EQUALS ||
接著撰寫以下敘述:
if (x == 0 EQUALS x == value) { //...
}
這可免除在相等的測試裡誤用單一等號的可能性。
雖然以上範例描述了 #define 敘述的優點,但要注意,若重新定義語言中已知的語法,並不是個撰寫程式的好習慣,
這會使人更難看懂你的程式。