#include 和 #import
不同點(diǎn):在引用關(guān)系很復(fù)雜的時(shí)候,#include會(huì)產(chǎn)生重復(fù)引用帶來(lái)的編譯問(wèn)題。比如:B 和 C 都引用了A,D 又同時(shí)引用了B和C,這樣A中定義的東西就在D中被定義了兩次,重復(fù)了。 而#import會(huì)保證每個(gè)頭文件只會(huì)被引用一次。
共同點(diǎn):#include和#import都是文本語(yǔ)義:預(yù)處理器在處理的時(shí)候會(huì)把這一行替換成相應(yīng)頭文件的文本,這種簡(jiǎn)單粗暴的替換會(huì)有很多問(wèn)題:
- 大量的預(yù)處理消耗。假如有N個(gè)頭文件,每個(gè)頭文件又
#include了M個(gè)頭文件,那么這個(gè)預(yù)處理的消耗就是N*M。 - 文件導(dǎo)入后,宏定義容易出現(xiàn)問(wèn)題。因?yàn)槭俏谋緦?dǎo)入,并且按照
include依次替換,當(dāng)一個(gè)頭文件定義了#define std hello_word,而另一個(gè)頭文件剛好是C++標(biāo)準(zhǔn)庫(kù),那么include順序不同,可能會(huì)導(dǎo)致所有的std 都會(huì)被替換。
@import
@import不再使用文本模型,而是采用更高效的語(yǔ)義模型。module會(huì)被作為一個(gè)獨(dú)立的模塊編譯,并且產(chǎn)生獨(dú)立的緩存。從而大幅度提高預(yù)處理效率,這樣時(shí)間消耗從 M*N 變成了M+N
參考文檔
https://juejin.im/post/5c22eaf1f265da611b5863b2#heading-11
https://onevcat.com/2013/06/new-in-xcode5-and-objc/