IOS 預處理語句

2021-09-07 01:29:38 字數 2841 閱讀 3758

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

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

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

預處理語句可以大概劃分成三類:檔案包含、巨集定義和條件編譯,下面,就一一來講解。

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

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

在使用檔案包含的時候,會遇到a檔案中用到b檔案,b檔案中用到a檔案,這種相互使用包含的關係,這種情況就有點像死迴圈了,要使用a檔案,必須要先有b,可是在b中,又需要先有a,因此在執行的時候,會出現錯誤。解決這個問題最好的辦法,是用@class代替檔案包含,@class就是表明有這個類,等在原始檔中真正用到的時候再包含檔案。

**:

//

a.h//

test

////

created by jerei on 15-7-24.

////

#import

@class

b;@inte***ce

a : nsobject

@property (nonatomic, strong) b *obj;

@end

////

b.h//

test

////

created by jerei on 15-7-24.

////

#import

@class

a;@inte***ce

b : nsobject

@property (nonatomic, strong) a *obj;

@end

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

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

**:

//

main.m

//test

////

created by jerei on 15-7-24.

////

#import

#define jr_pi 3.14

#define jr_max(a,b) ((a>b)?(a):(b)) //

得到兩個數中較大值

#define jr_square_1(n) n*n //

求數字的平方

#define jr_square_2(n) (n)*(n) //

求數字的平方

#define jr_hello @"hello world";

int main(int argc, const

char *argv)

return0;

}

在**中可以看到,同樣都是求乙個數的平方,但是兩個巨集定義得到的結果卻是不一樣的。第乙個計算2+1的平方的時候是2+1*2+1,所以結果為5,答案錯誤。因此,在寫巨集定義,帶引數的時候,需要設定小括號,保證正確性。

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

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

**:

//

main.m

//test

////

created by jerei on 15-7-24.

////

#import

#define jr_count 10

int main(int argc, const

char *argv)

return0;

}

疑問諮詢或技術交流,**入官方qq群:

傑瑞教育

出處:

本文版權歸煙台傑瑞教育科技****

mysql預處理語句 MYSQL 預處理語句

一 預處理語句介紹 mysql支援服務端預處理語句,預處理語句利用高效的客戶端 服務端二進位制協議。用佔位符替換引數值的預處理語句有下列兩個好處 每次執行語句時,解析語句的開銷更小。通常,資料庫應用程式會處理大量相似的語句,只在子句中更改文字或變數值,比如查詢和刪除的where子句,更新的updat...

mysql 預處理語句 in MySQL預處理語句

預製語句的sql語法基於三個sql語句 prepare stmt name from preparable stmt execute stmt name using var name var name prepare stmt name prepare語句用於預備乙個語句,並賦予它名稱stmt na...

筆記 iOS預處理

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