黑马程序员技术交流社区

标题: .h文件相互调用的问题 [打印本页]

作者: Ye•Ye    时间: 2014-5-7 15:56
标题: .h文件相互调用的问题
本帖最后由 Ye•Ye 于 2014-5-10 10:35 编辑

看视频里说两个文件的头文件不能互相调用,不能理解什么意思。
那两个.h文件在.m文件里为什么就可以互相调用呢?能讲一下原理吗?

作者: godlike    时间: 2014-5-7 17:22
这样说吧,先拿一个函数举例:比如你写了一个void test()函数;那么如果你像调用该方法的话,要么把这个函数写在main之前;要么写在main之后,但是要在main之前对这个函数声明;
  1. void test(); // 函数声明
  2. int main()
  3. {
  4.     test(); // 函数调用
  5. }
  6. void test() // 函数实现
  7. {
  8.     .........
  9. }
复制代码

   类也一样,要想创建某个类的对象,你得把类声明搞过来吧;
1:而在OC中,@interface中的,就是类的声明,implementation是类的实现。而根据xcode编译时的特点,我们习惯把类的声明,放在头文件:***.h中,实现自然在***.m中;
2:而在另一个文件里我们想要用这个类,我们只需要:import "***.h"就行了,而这个import相当于是把***.h里的代码拷贝过去了,不存在什么.h文件的互相调用,这个叫文件包含更好一点;
3:你的问题我比较不太懂,就当做你不明白:为什么包含的是.h文件而不是.m文件吧;说实话,谁都可以包含谁,之所以我们包含.h文件是因为:xcode编译器,编译链接时,他会让项目中所有的.m文件参与编译,生成.o 文件,如果你包含了.m文件,按照xcode的编译方式编译,会出现类的重复实现,从而报错;
举个例子吧:
Person.h头文件中放的是Person类的声明,Person.m文件中是它的实现;现在你在另外一个main.m文件想要用Person类:假设我们包含了Person.m文件,就是这样了:
  1. #import "Person.m" // 这句话相当于把Person类的实现的代码拷贝到这了;
  2. int main()
  3. {
  4.    ...........
  5. }
复制代码

那么xcode会这样编译链接是这样的: cc  Person.m  main.m -framework Foundation;
请注意:这样Person.o里会由Person类的实现,main.o也由Person类的实现(因为你包含了Person.m文件),这时会报一个链接错误:Person重复实现的错误;
当然你如果通过终端,自己手动敲 : cc main.m -framework Foundation 不要编译Person.m 文件,自然不会出错;但是xcode 不会这么干,所以为了我们包含.h文件,即类的声明即可;
不知道你能不能理解,多想想;




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2