預處理:分析程式前先處理的語句,它可以識別散布在程式中的特定語句。所有的預處理語句都適用「#」開頭,這個符號必須是一行中的第乙個非空字元。
預處理可以大概分為三類:檔案包含、巨集定義和條件編譯。
檔案包含:在當前檔案中用到其它檔案中的函式或方法或其它資訊時,可以將其它檔案的標頭檔案包含進來,然後再當前檔案中使用,檔案包含一般放到檔案的開頭。
如果使用c語言程式設計,檔案包含是#include<>或者#include ""。如果使用objective-c語言,檔案包含為#import<>或者#import ""。#include和#import最大的區別是#import在匯入檔案的時候進行了去重複檢查,此外,""和<>兩也是有區別的,""一般是用來引用自定義的檔案,<>一般是用來引用系統的檔案。程式在執行的時候,會根據你寫的樣式,優先去尋找對應型別的檔案。比如<>會先去找系統檔案,如果找不到,再去找自定義檔案。所以正確的選擇樣式,能夠提高程式的執行效率。
迴圈引用:在使用檔案包含的時候,會遇到a檔案中用到b檔案,b檔案中用到a檔案,這種互相使用包含的關係就有點類似死迴圈了,執行的時候就是報錯。解決這個問題最好的辦法就是用@class代替檔案包含,@class就是表明有這個類,等在原始檔中真正用到的時候才會去包含檔案。
在程式中,有一些常量或者簡短的函式是會被多次重複呼叫的,對於這些常用的資料,我們可以使用巨集定義。使用巨集定義可以快速的完成程式中的多處配置,最大的好處就是只要修改巨集定義的值,所有使用巨集定義的值都會發生改變。此外,巨集定義是在程式編譯之前進行替換和設定,比定義成全域性變數或者函式的效率要高。
巨集定義是通過#define來實現的,一般寫在程式檔案包含的下面。巨集名通常用全部的大寫字母表示,下面,就通過**來看一下巨集定義的使用。
條件編譯:在編譯之前由預處理器來根據處理語句進行判斷,如果滿足條件,就編譯滿足條件下的**。反之就不進入編譯環節。
條件編譯主要分為兩種:一種是判斷是否定義過某個巨集,根據是否定義過這個巨集,來決定是否編譯某段**。另外,還有一組語句和條件結構中的階梯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 顯示編譯錯誤資訊
預處理指令
預處理指令是我們寫在程式 中的給預處理器 preprocessor 的 命令,而不是程式本身的語句。預處理器在我們編譯乙個c 程式時由編譯器自動執行,它負責控制對程式 的第一次驗證和消化。所有這些指令必須寫在單獨的一行中,它們不需要加結尾的分號 在這個教程的開頭我們已經提到了一種預處理指令 defi...
預處理指令
1.人們常常稱機器語言為目標 object code 2.預處理命令 preprocessor directives 三種預處理包括 巨集定義 檔案包含 條件編譯。在對源程式編譯之前,會對程式中的所有預處理指令進行處理。預處理就是在進行編譯的第一遍詞法掃瞄和語法分析之前所作的工作。說白了,就是對原始...
預處理指令
普通 define 巨集名 字串 define my int int define max 10000 帶引數 define 巨集名 形參 字串 define add x,y x y 在大規模的開發過程中,特別是跨平台和系統的軟體裡,條件編譯很重要。include using namespace s...