#include、#import与@class的使用与头文件循环引用问题

#include

  • #include <>:通常是对系统库文件的引用,编译器会去系统文件目录下查找。
  • #include “xxx.h”:通常是对自定义文件的引用,编译器首先会去用户目录下查找,然后再去安装目录查找,最后去系统文件目录查找。

#import

  • #import的功能与#include差不多,但是可以解决头文件重复导入的问题,而#include会有重复导入头文件的问题,

    比如class文件A、B都引用了class C,如果class D引用了class A、B,这时候就会报重复引用的错误,因为相当于class D引用了两次class C。所以在Objective-C中我们是经常使用#import。

@class

  • 这个又什么时候会使用呢?经常是用来解决头文件循环引用的问题,因为#import “xxx.h” 是相当于把头文件复制到另一个头文件。在某些情况下,比如:
    class A.h使用了#import "B.h"
    class B.h使用了#import "A.h"

循环引用问题:

那么这就会导致了头文件循环引用的问题了,通常都是出现虽然你导入了该头文件,但在使用时比如使用@propery(nonatomic)A *a;会出现:

Unknown Type 之类错误. 所以这个时候@class就派上用场了。

解决方案:

在class A中不用做改变,在class B.h中使用@class A替换#import "A.h"。@class的作用只是跟头文件说明有这个文件,你可以定义这个类型的属性,然后我们在实现B.m文件再使用#import "A.h"即可使用class A中定义的所有函数与属性。这就解决了循环引用的问题。

总结:

很多情况出现头文件循环引用的问题不是这样简单的情况,有时候会因为多重继承和多重引用而使情况显得很复杂。比如:

  class A 继承 class B
->class B 继承 class C
->class C 继承 class D
  class D 中#improt "F.h"
->class F 继承了 class E
  class E 中#improy "A.h"
  ...
这时候class D与class E就出现了循环应用头文件的问题。但你说好吧这个简单,class D或者E中某一个使用个@class不就解决了。
假如让D使用@class。但是如果D需要使用到E的变量或者函数呢?
所以面对多重继承多重引用的时候我们一定要小心使用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 09:01:37

#include、#import与@class的使用与头文件循环引用问题的相关文章

头文件循环引用的错误

In file included from /usr/include/c++/5/memory:81:0,from Threadpool.h:12,from testThreadpool.cc:7:/usr/include/c++/5/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = wd::Thread]':/usr/include

c++ 头文件循环引用解法

A.h #include "B.h" class A{ public: B* m_b; } B.h #include "A.h" class B{ public: A* m_a; } 上面这样是编译不过的,把A.h中的 #include "B.h" 去掉,改为 class B;

#include&lt;bits/stdc++.h&gt;包含所有C++头文件

#include<bits/stdc++.h>包含所有C++头文件,比如以下 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <st

头文件重复引用

Q:.h头文件中的ifndef/define/endif 的作用? A:防止该头文件被重复引用. 说明: 有些头文件重复包含只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些. 有的会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的) . 如果头文件被循环包含,有的编译器会智能处理,和只include一次一样:有的会报错,有的直接死锁,导致编译程序崩溃(这个只有很低级的编译器才会出现在几乎看不到了). 不管怎样,用ifnde xxx #defi

c++头文件重复引用问题

引子----之前写C++ 时遇到的坑 之前由于Java实在太好用了,C++的工程代码几乎没怎么碰,真的写起来的时候总会有些小bug,这里就对其中的一个进行个总结 a.h #include "b.h" class a{ public: a(); ~a(); } a.cpp #incldue "a.h" a::a(){ .... }; a::~a(){ .... }; b.h #include "a.h" class b{ public: b();

关于Cocos2d-x头文件的引用

cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprite.h已经不见了,取代的是G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\cocos\ui\UIScale9Sprite.h 还有就是#include "..\extensions/GUI/CCControlExtension/CCControlSwitch.h"

clion中资源文件以及头文件的引用

在代码界面的最上面出现了 the file does not belong are project....... 按照上面的样式把文件添加进去  在reload的一下就OK了 原文地址:https://www.cnblogs.com/future-dream/p/9739677.html

C++预编译头文件(#include &quot;stdafx.h&quot;)

来源:http://blog.sina.com.cn/s/blog_4ac766c00100qsbd.html http://blog.csdn.net/txh0001/article/details/7031058 作为一个C++菜鸟,在预编译头文件(#include "stdafx.h")上纠结了很久,今天打算彻底弄明白它. 1.预编译头文件的概念 所谓的预编译头文件,其实我们很熟悉的,这里的头文件(Microsoft Visual C++中)一般的说就是我们常见的stdafx.h

#include #import @class 的一些用法区别

从网上查了一些资料,整理了一下,发现很多都说的比较详尽,下面摘录自网络 说一下#import同class之间的区别 在ios中我们经常会在.h和.m中引入一些类啊等等一般用的是#import来进行声明,你们可能也见到在.h文件进用@class来声明的,那么#import和@class进行声明 到底有什么的区别呢? 1. import会包含这个类的所有信息,包括实体变量和方法,而@class只告诉编译器,声明的类的名称,至于这些类是如何定义的,暂时不用考虑,所以在头文件中如果用@class声明某个