#include 和 #import
不同点:在引用关系很复杂的时候,#include
会产生重复引用带来的编译问题。比如:B 和 C 都引用了A,D 又同时引用了B和C,这样A中定义的东西就在D中被定义了两次,重复了。 而#impor
t会保证每个头文件只会被引用一次。
共同点:#include
和#import
都是文本语义:预处理器在处理的时候会把这一行替换成相应头文件的文本,这种简单粗暴的替换会有很多问题:
- 大量的预处理消耗。假如有N个头文件,每个头文件又
#include
了M个头文件,那么这个预处理的消耗就是N*M。 - 文件导入后,宏定义容易出现问题。因为是文本导入,并且按照
include
依次替换,当一个头文件定义了#define std hello_word
,而另一个头文件刚好是C++标准库,那么include
顺序不同,可能会导致所有的std 都会被替换。
@import
@import
不再使用文本模型,而是采用更高效的语义模型。module会被作为一个独立的模块编译,并且产生独立的缓存。从而大幅度提高预处理效率,这样时间消耗从 M*N 变成了M+N
参考文档
https://juejin.im/post/5c22eaf1f265da611b5863b2#heading-11
https://onevcat.com/2013/06/new-in-xcode5-and-objc/
网友评论