預處理程式 預處理程式語句使用井號(#)標記,這個符號必須是一行中的第一個非空格字元。 #define 語句(這種預定義通常也被稱為定義“巨集”): #define 語句的基本用途之一就是給符號名稱指定程式常量。 例如: #define Constant 1//預處理程式語句後面不要加分號(;) ,因 ...
--------預處理程式--------
- 預處理程式語句使用井號(#)標記,這個符號必須是一行中的第一個非空格字元。
- #define 語句(這種預定義通常也被稱為定義“巨集”):
- #define 語句的基本用途之一就是給符號名稱指定程式常量。 例如:
-
#define Constant 1
//預處理程式語句後面不要加分號(;) ,因為預定義名稱一齣現,預處理程式就會將右邊的所有字元替換到程式中去。所以在預處理程式語句的後面不需要加 分號(;) ,不然也會一併替換到程式中 - 代碼定義了程式常量 Constant ,並使他的值等於 1 。在這之後,在任何需要常量 1 的地方都可以用 Constant 來替代。預處理程式會在程式中將這個名稱(Constant)替換為預定義的值 1。
- 預處理程式會將 #define 語句中預定義名稱右邊的所有字元都替換到程式中去。所以在預定義名稱的右邊,可以是常量、語句、代碼或是任何有意義的東西。
- #define 語句經常放在程式的開始,但 #import 或 include 語句之後。這並不是必須的,他們可以出現在程式的任何地方。但是,在程式中應用這個名稱之前,必須先定義他們。
- 預定義的名稱和變數的行為方式不同,沒有局部定義之類的說法。在定義一個名稱之後,就可以在程式的任何地方使用它。
- 預定義的值本身可以引用另一個預定義的值。
- 定義帶有參數的巨集:
-
在定義帶有參數的名稱時,預定義名稱的參數列表的左括弧之間不允許空格。
帶參數的巨集定義的一般形式如下:#define <巨集名>(<參數表>) <巨集體>
其中, <巨集名>是一個標識符,<參數表>中的參數可以是一個,也可以是多個,視具體情況而定,當有多個參數的時候,每個參數之間用逗號分隔。<巨集體>是被替換用的字元串,巨集體中的字元串是由參數表中的各個參數組成的表達式。例如:
#define SUB(a,b) a-b
如果在程式中出現如下語句:
result=SUB(2, 3);
則被替換為:
result=2-3;
如果程式中出現如下語句:
result= SUB(x+1, y+2);
則被替換為:
result=x+1-y+2;
在這樣的巨集替換過程中,其實只是將參數表中的參數代入到巨集體的表達式中去,上述例子中,即是將表達式中的a和b分別用2和3代入。
我們可以發現:帶參的巨集定義與函數類似。如果我們把巨集定義時出現的參數視為形參,而在程式中引用巨集定義時出現的參數視為實參。那麼上例中的a和b就是形參,而2和3以及x+1和y+2都為實參。在巨集替換時,就是用實參來替換<巨集體>中的形參。
-
- 預處理程式換行規則:
- 通常,預處理程式假設定義包含在程式的一行中。如果需要第二行,那麼上一行的最後一個字元必須是反斜杠線符號(\)。這個字元告訴預處理程式這裡存在一個後續。對於多個後續行也同樣是如此。
- #import 語句(導入文件指令):
- 導入文件最出色的能力之一是他是你能夠把定義集中起來,從而確保所有的程式應用相同的值。
-
//例句: #import "file.h"
-
在 Objective-C中,#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定一個文件只能被導入一次,這使你在遞歸包含中不會出現問題
@class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
@class就是告訴編譯器有這麼一個類,至於類的定義是啥不知道
@class一般用於頭文件中需要聲明該類的某個實例變數的時候用到,在m文件中還是需要使用#import
#import<> 跟 #import""又什麼區別?
“”的意思是自己創建的文件,用這個首先會在當前的目錄中尋找,如果找不到就到其他的位置尋找,“”和<>是相對的一個是自己創建的文件一個是系統的文件
- 條件編譯:
- 條件編譯通常用於創建可以在不同系統上編譯運行的程式。他還經常用來開關程式中的各種語句。
- #ifdef、#endif、#else和#ifndef語句:
//例:如果前面已經定義了一個符號(IPAD),下麵的語句就把 kImageFiel 定義為 @"barnHD.png" ,否則就定義為 @"barn.png" #ifdef IPAD #define kImageFile @"barnHD.png" #else #define kImageFile @"barn.png" #endif
//如果程式編譯時,#ifdef 行中所指定的符號已經通過 #define 語句或命令行定義了,那麼編譯器將處理從此處開始到 #else 、#elif 或 #endif 的程式段,否則將忽略這個程式段。 - #if 和 #elif 預處理程式語句:
- if 語句可以用來檢測常量表達式是否為非零。如果表達式結果為非零,就會處理到 #else、#elif 或 #endif 位置的所有後續行。否則將跳過他們。
-
//例:這裡講預定義變數 MAC_OS_X_VERSION_MIN_REQUIRED 的值與預定義變數 MAC_OS_X_VERSION_10_5 的值進行比較。如果前者小於後者,就處理隨後的 #define
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
#define NSMaximumStringLength (INT_MAX-1)#endif
//特殊運算符 define(name) 也可以用在#if語句中
#if defined(DEBUG)
……
#endif
和
#if DEBUG
……
#endif
的作用相同 - #undef 語句:
- 在一些情況下,可能需要使一些已經定義的名稱成為未定義的,通過使用 #undef 語句就可以實現。
- 要消除特定名稱的定義,編寫如下語句
-
#undef name