黑马程序员技术交流社区
标题:
.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之前对这个函数声明;
void test(); // 函数声明
int main()
{
test(); // 函数调用
}
void test() // 函数实现
{
.........
}
复制代码
类也一样,要想创建某个类的对象,你得把类声明搞过来吧;
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文件,就是这样了:
#import "Person.m" // 这句话相当于把Person类的实现的代码拷贝到这了;
int main()
{
...........
}
复制代码
那么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