筆記 iOS預處理

2021-09-11 12:51:21 字數 2100 閱讀 1075

編譯是通過編譯器將每個檔案的**都轉為二進位制**,在這個過程中,如果有語法錯誤,會有編譯失敗的提示,如果成功,那麼會生成對應多個目標檔案。在乙個檔案中可能會用到其他檔案,因此,還需要將編譯生成的目標檔案和系統提供的檔案組合到一起,這個過程就是鏈結,最後生成了可執行檔案。

通常人們所理解的程式執行就是編譯和鏈結兩個階段,但實際上在編譯之前,預處理器要進行預處理操作,處理完之後才能進入到編譯階段。因為預處理指令是在編譯之前就進行了,所以它比程式執行時進行操作的效率高。

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

預處理可以大概分為三類:檔案包含、巨集定義和條件編譯

檔案包含:在當前檔案中用到其它檔案中的函式或方法或其它資訊時,可以將其它檔案的標頭檔案包含進來,然後再當前檔案中使用,檔案包含一般放到檔案的開頭。

如果使用c語言程式設計,檔案包含是#include<>或者#include""。如果使用objective-c語言,檔案包含為#import<>或者#import""#include#import最大的區別是:#import在匯入檔案的時候進行了去重複檢查,此外,""和<>兩者也是有區別的,""一般是用來引用自定義的檔案,<>一般是用來引用系統的檔案。程式在執行的時候,會根據你寫的樣式,優先去尋找對應型別的檔案。比如<>會先去找系統檔案,如果找不到,再去找自定義檔案。所以正確的選擇樣式,能夠提高程式的執行效率。

迴圈引用:在使用檔案包含的時候,會遇到a檔案中用到b檔案,b檔案中用到a檔案,這種互相使用包含的關係就有點類似死迴圈了,執行的時候就會報錯。解決這個問題最好的辦法就是用@class代替檔案包含,@class就是表明有這個類,等在原始檔中真正用到的時候才會去包含檔案。

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

巨集定義是通過#define來實現的,一般寫在程式檔案包含的下面。巨集名通常用全部的大寫字母表示。

條件編譯:在編譯之前由預處理器來根據處理語句進行判斷,如果滿足條件,就編譯滿足條件下的**。反之就不進入編譯環節。

條件編譯主要分為兩種:一種是判斷是否定義過某個巨集,根據是否定義過這個巨集,來決定是否編譯某段**。另外,還有一組語句和條件結構中的階梯if結構非常類似,但是寫法上有區別,是#if、#elif、#else、#endif組成。需要注意的是,無論哪種,都要有#endif結束標誌。此外,最重要的一點是: 條件編譯中的條件不能使用普通變數,一般會選擇使用巨集定義。

#import 

#define zb_count 10

int main(int argc, const char * ar**)

return 0;

}複製**

最後補充一下預處理常用指令:

#           空指令,沒有任何效果

#include 包含乙個源**檔案

#define 定義巨集

#undef 取消定義巨集

#if 如果條件為真,則編譯下面的**

#elif 如果前面的#if不為真,則編譯下面的**

#endif 結束乙個#if。。。#elif條件編譯塊

#ifdef 如果已經定義了某個巨集,則編譯下面的**

#ifndef 如果沒有定義某個巨集,則編譯下面的**

#error 停止編譯並顯示錯誤資訊

複製**

原文

IOS 預處理語句

程式中的源 計算機是無法識別的,需要將寫好的 轉成0 1二進位制 計算機才能識別。將源 轉成二進位制 的需要經過兩步,編譯和鏈結。編譯是通過編譯器將每個檔案的 都轉為二進位制 在這個過程中,如果有語法錯誤,會有編譯失敗的提示,如果成功,那麼會生成對應多個目標檔案。在乙個檔案中可能會用到其他檔案,因此...

ios 預處理 巨集 define

目錄 1 分類 2 特點 3 巨集定義的基本操作 4 巨集的高階用法 帶引數的用法 5 條件編譯指令 一 分類 1 檔案包含指令 include 2 巨集定義 3 條件編譯指令 二 特點 1 都是以 開頭 2 預處理指令都是在編譯之前執行 3 預處理指令後面都沒有分號 三 巨集定義的基本操作 1 預...

IOS 開發學習四 預處理

include define num 6 int main int argc,const char argv for int i 0 i include define sum a,b a b 注意引數加括號,防止錯誤 int main int argc,const char argv 巨集定義沒有引...