1、 關於#define語句:
(1)、#define語句的用途就是給某個符號名稱指定乙個程式要用到的常量,比如:
#define true 1
這個語句的意思就是把true指定為1,那麼後續的程式中如果需要用到1來做判斷或者計算,就可以直接使用true這個符號名稱了;
(2)、預定義名稱不是變數,所以不能在程式過程中給它賦值,不能改變它的值;
(3)、注意#define語句沒有用到等號,也不需要分號結尾,如果結尾加上分號的話,那麼這個常量的值就會變成你想要的值和乙個分號的合併了,即是這個分號也會被和值同時替換到這個預定義名稱中;
(4)、#define語句一般寫在程式開始的地方,在#import和include語句後面,但是其實它可以出現在程式的任何位置,只要出現在程式引用它的位置之前即可;
(5)、預定義名稱和變數不同,它沒有區域性作用域這個概念,你可以在程式中任何位置使用你定義過的預定義名稱。一般把它放在標頭檔案中,以便在多個原始檔中使用它們;
(6)、使用預定義名稱來代替常量值,這樣增加了程式的可讀性,能清晰地看到某個常量的含義以及它的用途。同時如果使用了這種方法定義常量,然後在程式中發現這個常量出錯了,那麼你只需要修改#define語句,而不需要整個程式去查詢這個常量出現的地方並乙個乙個修改;
(7)、一般來說預定義名稱有兩種命名習慣:一種是全部字母都大寫,比如(1)的例子,一種是以k開頭,比如(1)的預定義名稱也可以寫作ktrue。
2、其實編譯器在處理預定義名稱的時候,所做的僅僅是簡單的查詢替換,編譯過程中把所有的預定義名稱替換成所定義的值;
3、在#define語句中還可以出現表示式,比如這個例子是合法的:
#define two_pi 2.0*3.1415926
也可以出現關係運算子,比如這個例子也是合法的:
#define and &
4、預定義的值本身可以引用另乙個預定義的值,比如:
#define pi 3.1415926
#define two_pi 2.0*pi
這種情況是合法的,設定把這個兩個語句的順序顛倒過來,也是合法的。
5、如果預定義的名稱或者值過長,甚至需要換行寫,那麼上一行的最後乙個字元必須是反斜槓,如下例:
#define *** ( 2.0 * 5.0 + 31.0 * 7.0 )\
* 56.0
這個表示式相當於( 2.0 * 5.0 + 31.0 * 7.0 ) * 56.0,注意是可以有空格的。
6、關於巨集:
(1)、可以讓預定義名稱本身帶著乙個或多個引數,在編譯的時候,編譯器會自動把引數替換到預定義值的對應位置去。這種預定義成為巨集。如下例子:
#define ***(y) y * 2.0 + y / 5.0
這個預定義允許你在**中寫出n=***(5); 這樣的語句;
(2)、巨集和方法不同,巨集的引數是沒有型別的,僅僅只是執行字面意義上的替換。同時需要注意,在預定義名稱和引數列表的括號之間不允許有空格;
(3)、在定義巨集時,引數列表內的每個單獨的引數都要打上括號,因為巨集只是執行字面意義上的替換,不打括號會有可能出錯。如果定義乙個巨集如下:
#define square(x) x * x
那麼當出現n=square(y+1)時,這個等式會被替換稱n=y+1*y+1,就與本來想求的值不同了。所以這個預定義應該寫為:
#define square(x) ((x) * (x))
全部用括號括起來最保險,因為你有可能會使用square(x)去和其他數值運算;
(4)、甚至在巨集的預定義值中可以呼叫方法,假設fraction類有乙個初始化的設值方法initwith:over:,那麼可以有以下巨集定義:
#define make_frac(x,y) ([[fraction alloc] initwith:x over:y])
(5)、巨集中允許出現判斷語句,比如:
#define max(x,y) ((a) > (b)? (a): (b))
(6)、巨集中允許出現關係運算子,比如:
#define is_lower_case(x) ((x)>=』a』 && (x)<=』z』)
(7)、甚至可以在巨集中進行字元從小寫到大寫的轉換,如下例子:
#define to_upper(x) (is_lower_case(x)? (x)-『a』+』a』: (x))
7、可以把所有要用到的預處理定義收集到單獨乙個h檔案中,然後在程式中使用#import把它引入進來。一般使用雙引號引入。
8、使用雙引號引入檔案,系統會在包括當前目錄在內的多個目錄查詢引入檔案;把檔名放在尖括號裡面,會導致系統只在「特殊」的系統檔案目錄中查詢包含檔案。
9、關於幾個條件編譯語句:
(1)、有時候系統需要使用到硬體的型別來作為引數,比如某個頁面在ipad和iphone上的顯示可能就會不同,需要顯示不同尺寸的,那麼此時就需要判斷系統的某些引數。
假設在乙個ipad程式中已做了以下定義:
#define ipad 1
那麼可以使用條件編譯語句進行如下判斷來選擇要顯示那張:
#ifdef ipad
# define kimagefile @」***ipad.png」
#else
# define kimagefile @」***.png」
#endif
這裡就使用了#ifdef、#else和#endif這三個條件編譯語句進行了判斷;
(2)、同時可以注意到(1)中,#define語句在井號和define之間可以出現空格;
(3)、另外還有#if和#elif兩種語句,if語句用來判斷常量表示式是否為0;
10、最後還有乙個#undef語句,這個語句可以將一些已經定義過的名稱消除掉,恢復到未定義的狀態;
oc自學 預處理程式
define語句 define true 1定義了名稱true,並使它等於值1。之後,名稱true可以用於程式中任何需要常量1的地方。預定義名稱不是變數,因此,不能為他賦值,除非替代指定值的結果實際上是乙個變數。更高階的定義型別 define two pi 2.9 pi define pi 3.14...
oc自學 預處理程式
define語句 define true 1定義了名稱true,並使它等於值1。之後,名稱true可以用於程式中任何需要常量1的地方。預定義名稱不是變數,因此,不能為他賦值,除非替代指定值的結果實際上是乙個變數。更高階的定義型別 define two pi 2.9 pi define pi 3.14...
預處理程式
預處理提供了一些工具,使用這些工具更易於開發 閱讀 修改程式,也易於將程式移植到不同的系統中。你也可以使用預處理程式定製objective c語言,以適應特定應用的程式設計或自己的程式設計風格。預處理程式是objective c編譯過程的一部分,它可以識別散布在程式中的特定語句。預處理程式使用井號 ...