作者 robin
預處理程式都是用#標記的
1.#define
所有使用#define的定義盡量都使用大寫字母組合.使用預定義名稱有助於加強程式的可擴充套件性.
不要在語句後加分號.預定義沒有區域性定義之說,在定義了乙個名稱後,就可以在程式的任何地方使用.
用途1:為符號名稱指派常量
#define ture 1 //ture 等於 1,在之後ture出現的地方會直接被替換成1
*** = ture; // 該語句等價 *** = 1
#define 的作用類似文字編輯中的替換.
比如要用到常量 派 ,但是數字太長,可以使用下面的#define語句:
#define pi 3.1415926
在後面的方法就可以直接使用pi來替換3.1415926出現的位置.
用途2:定義表示式
#define two_pi 2.0 * 3.1415926
這樣的話,使用two_pi 就可以在方法中替代2.0 * 3.1415926了.
用途3: 重新定義關鍵字
#define and &&
#define or ||
這樣的話在使用and和or來代替&&和||,但是這是不好的習慣,盡量不要這樣使用.
乙個預定義的值本身可以引用另乙個預定義的值.
用途4:減少注釋
#define is_leap_year year % 4 == 0 && year % 100 != 0 || year % 400 == 0
這樣的話就可以在語句中直接引用is_leap_year來取得值:
if(is_leap_year)
用途5: 設定引數
#define is_leap_year()y y % 4 == 0 && y % 100 != 0 || y % 400 == 0
這樣就不僅僅只針對year變數判斷了,還可以判斷其他的變數.
if(is_leap_year (year) )
if(is_leap_year (year2) )
這樣的話就會用year或者是year2來替換巨集中的y,這種型別的巨集一般都帶有1個或多個引數的定義.
在任何乙個有巨集的語句中,都要使用括號將引數括起來,以便出現不可預知的問題.
用途6: 定義類中的多引數方法
#define make(x,y) ([[fraction alloc] initwith: x over : y])
使用的時候就可以用一下的表示式:
myfract = make(1, 3);
2.#運算子
如果在巨集定義中的引數前放乙個#號,那麼在呼叫該巨集時,預處理程式將根據巨集引數建立c風格的常量字串.
#define str(x) # x,
隨後srt(testing)的呼叫顯示為
「testing」。
會在引數兩邊加入雙引號,引數中的任何雙引號或者是反斜線都是預處理程式中的保留字.所以
str (「test」)
會得到「\」test\」"。
下面是乙個比較實用的的巨集定義:
#define printint(var) print (# var 」 = %i\n」, var)
如果*** = 100,則
printint (***) 將會被擴充套件為:
print (「***」 」 = %i\n」, ***);
編譯器會把相鄰的兩個字串連在一起,形成:
print (「*** = %i\n」, ***);
3.##運算子
##運算子將兩個標記連在一起,它的前面或者後面是巨集引數名稱.預處理程式使用呼叫該巨集時提供的實際引數,並且根據該引數和##之後或之前的標記建立單個標記.
例如有乙個從x1到x100的變數列表,可以寫乙個printx的巨集
#define printx(n) printf(「%i\n」,x ## n)
x ## n 表示x和引數n,並根據他們構建乙個標記.
printx(20)會被擴充套件成為:
printf(「%i\n」,x20);
4.#import語句
隨著時間的推移,可能會寫出一組巨集,在每乙個程式中使用,可以將這些巨集收集到乙個標頭檔案中,然後在實現部分引用該標頭檔案就可以了.
<>標籤指的是從sdk目錄中查詢.
「」標籤指的是從當前目錄中查詢.
5.條件編譯
條件編譯可以在不同的機器上編譯程式,也可以用來開關程式中的各種語句.
#ifdef,#endif,#else和#ifndef語句
如果在之前定義了符號mac_os_x,下面的語句就把datadir定義為/uxn1/data.
#ifdef mac_os_x
# define datadir 「/uxn1/data」
#else
# define datadir 「\usr\data」
#endif
可以在#後跟1個或多個空格,如果程式編譯時,#ifdef行中所指定的符號已經通過#define定義了,那麼編譯期將會處理從此處到#else到#ifndef的語句,否則就忽略這部分程式.
#ifndef x //測試x是否被巨集定義過
#define x
***1… //如果x沒有被定義過,則定義,並執行***1
#endif
***2… //如果x被定義過,則執行***2,無視上面的內容.
#ifdef 如果定義了後面的巨集,則執行
#ifndef 如果沒有定義後面的巨集,則執行
6.#if和#elif語句
#if提供了更通用的控制編譯的語句. #elif = else if
#if mac_os_x_version_min_required < mac_os_x_version_10_5 //如果mac版本小於 10.5
#define nsmaximumstringlength (int_max-1) //就執行這個,如果版本在10.5以上版本執行,就將最大值減1
#endif
7.define的特殊用法
#if defined (mac_os_x)
…#endif
#if defined (mac_os_x) && mac_os_x
mac_os_x必須被定義且不等於0
#undef 用於取消定義過的名稱
看看預處理程式Objective C怎麼成魔的
預處理提供了一些工具,使用這些工具更易於開發 閱讀 修改程式,也易於將程式移植到不同的系統中。你也可以使用預處理程式定製objective c語言,以適應特定應用的程式設計或自己的程式設計風格。預處理程式是objective c編譯過程的一部分,它可以識別散布在程式中的特定語句。預處理程式使用井號 ...
預處理程式Objective C之成魔之路
預處理提供了一些工具,使用這些工具更易於開發 閱讀 修改程式,也易於將程式移植到不同的系統中。你也可以使用預處理程式定製objective c語言,以適應特定應用的程式設計或自己的程式設計風格。預處理程式是objective c編譯過程的一部分,它可以識別散布在程式中的特定語句。預處理程式使用井號 ...
預處理程式Objective C之成魔之路
預處理程式objective c之成魔之路 預處理提供了一些工具,使用這些工具更易於開發 閱讀 修改程式,也易於將程式移植到不同的系統中。你也可以使用預處理程式定製objective c語言,以適應特定應用的程式設計或自己的程式設計風格。預處理程式是objective c編譯過程的一部分,它可以識別...