1. 程式人生 > >oc溫習六:預處理指令

oc溫習六:預處理指令

替換 port 區別 div war 找不到 能夠 預處理命令 ive

預處理:分析程序前先處理的語句,它可以識別散布在程序中的特定語句。所有的預處理語句都適用“#”開頭,這個符號必須是一行中的第一個非空字符。

預處理可以大概分為三類:文件包含、宏定義和條件編譯。

1.文件包含

文件包含:在當前文件中用到其它文件中的函數或方法或其它信息時,可以將其它文件的頭文件包含進來,然後再當前文件中使用,文件包含一般放到文件的開頭。

如果使用C語言編程,文件包含是#include<> 或者 #include ""。如果使用Objective-C語言,文件包含為#import<>或者#import ""#include#import最大的區別是 #import

在導入文件的時候進行了去重復檢查,此外,""<>兩也是有區別的,""一般是用來引用自定義的文件,<>一般是用來引用系統的文件。程序在執行的時候,會根據你寫的樣式,優先去尋找對應類型的文件。比如<>會先去找系統文件,如果找不到,再去找自定義文件。所以正確的選擇樣式,能夠提高程序的執行效率。

循環引用:在使用文件包含的時候,會遇到A文件中用到B文件,B文件中用到A文件,這種互相使用包含的關系就有點類似死循環了,運行的時候就是報錯。解決這個問題最好的辦法就是用@class代替文件包含,@class就是表明有這個類,等在源文件中真正用到的時候才會去包含文件。

2.宏定義

在程序中,有一些常量或者簡短的函數是會被多次重復調用的,對於這些常用的數據,我們可以使用宏定義。使用宏定義可以快速的完成程序中的多處配置,最大的好處就是只要修改宏定義的值,所有使用宏定義的值都會發生改變。此外,宏定義是在程序編譯之前進行替換和設置,比定義成全局變量或者函數的效率要高。

宏定義是通過#define來實現的,一般寫在程序文件包含的下面。宏名通常用全部的大寫字母表示,下面,就通過代碼來看一下宏定義的使用。

3.條件編譯

條件編譯:在編譯之前由預處理器來根據處理語句進行判斷,如果滿足條件,就編譯滿足條件下的代碼。反之就不進入編譯環節。 條件編譯主要分為兩種:一種是判斷是否定義過某個宏,根據是否定義過這個宏,來決定是否編譯某段代碼。另外,還有一組語句和條件結構中的階梯if
結構非常類似,但是寫法上有區別,是#if、#elif、#else、#endif組成。需要註意的是,無論哪種,都要有#endif 結束標誌。此外,最重要的一點是:條件編譯中的條件不能使用普通變量,一般會選擇使用宏定義。

Xcode預處理命令:

#define 定義一個預處理宏
#undef 取消宏的定義
#include 包含文件命令
#include_next 與#include相似, 但它有著特殊的用途
#if 編譯預處理中的條件命令, 相當於C語法中的if語句
#ifdef 判斷某個宏是否被定義, 若已定義, 執行隨後的語句
#ifndef 與#ifdef相反, 判斷某個宏是否未被定義
#elif 若#if, #ifdef, #ifndef或前面的#elif條件不滿足, 則執行#elif之後的語句, 相當於C語法中的else-if
#else 與#if, #ifdef, #ifndef對應, 若這些條件不滿足, 則執行#else之後的語句, 相當於C語法中的else
#endif #if, #ifdef, #ifndef這些條件命令的結束標誌.
defined 與#if, #elif配合使用, 判斷某個宏是否被定義
#line 標誌該語句所在的行號
# 將宏參數替代為以參數值為內容的字符竄常量
## 將兩個相鄰的標記(token)連接為一個單獨的標記
#pragma 說明編譯器信息#warning 顯示編譯警告信息
#error 顯示編譯錯誤信息

參考文獻:http://www.jianshu.com/p/4a133c651265

oc溫習六:預處理指令