#import是GCC编译器提供的,xcode在编译objective-c、c、c++程序时都会使用它,#import可保证头文件只被包含一次,而不论次命令实际上在那个文件中出现了多少次
C语言使用
#include语句通知编译器应在头文件中查询定义。
#include
区分
#include <x.h>
与
#include "x.h"
的作用
#include <x.h>:
它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件
.
#include "x.h":
用户自定义的文件用双引号引用,编译器首先会在用户目录下查找,然后到安装目录中查找,最后在系统文件中查找。
在使用
#include
的时候要注意处理重复引用(这也是
objc
中
#include
与
#import
的区别)
例如:
ClassA
与
ClassB
同时引用了
ClassC
,不做重复引用处理的时候在
ClassB
中同时引用
ClassA
,
ClassB
编译会提示对
ClassC
重复引用的错误
.
我们可以
:#ifndef _CLASSC_H
#define _CLASSC_H
#include "ClassC"
#endif
这样处理在编译时就不会有重复引用的错误出现(在
objc
中
#import
解决了这个问题,这是它们的区别)
#import
#import
大部分功能和
#include
是一样的,但是他处理了重复引用的问题,我们在引用文件的时候不用再去自己进行重复引用处理
.
@class
主要是用于声明一个类,告诉编译器它后面的名字是一个类的名字,而这个类的定义实现是暂时不用知道的,后面会告诉你
.
也是因为在
@class
仅仅只是声明一个类,所以在后面的实现文件里面是需要去
#import
这个类,这时候才包含了这个被引用的类的所有信息。
综上所述
#include
,
#import
与
@class
的区别可以做一下理解:
#include
与
#import
在引用一个类的时候会包含这个类的所有信息包括变量方法等,但是这样做会对编译效率造成影响
.
比如有
100
个类都
#import
了
ClassA
,那么在编译的时候这
100
个类都会去对
ClassA
处理
.
又比如
A
被
B
引用,
B
被
C
引用,
C
被
D
引用
.....
此时如果
A
被修改,那么后面的
B
,
C
,
D.....
都需要重新进行编译
.
还有一个用法会引起编译错误的就是在
ClassA
中
#import ClassB
在
ClassB
中
#import ClassA
那么在编译的时候也会出现未知错误。
所以一般来说,在
interface
中引用一个类,就用
@class
,它会把这个类作为一个类型来使用,而在实现这个
interface
的文件中,如果需要引用这个类的实体变量或者方法之类的,还是需要
import
这个在
@class
中声明的类。