objective C 預處理程式

2021-06-10 15:34:38 字數 3143 閱讀 1154

作者 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編譯過程的一部分,它可以識別...