当前位置:编程学习 > C/C++ >>

c++ include头文件

++调用类头文件为什么只需要include声明部分而不需要类的定义部分 10 [ 标签:c++ include,声明,定义 ] 如题 :
比如C++中新建一个r.h的头文件 ,并在头文件中声明了一个类,
然后添加一个源文件r.cpp来定义这个类,定义中使用#include"r.h";
然后再建一个m.cpp中实现主函数,使用#include “r.h”,就能运行得到结果。
但是问题是如果使用#include“r.cpp”就会报错。
不能理解,为啥m.cpp中没有#include"r.cpp",却调用了它,这是怎样实现的?
答案:首先include是可以包含.cpp文件的,只要你不把include中包含的.cpp文件添加到工程中组建就没问题了!可以把项目外部的文件包含进来,一起编译,这样就会只生成单独一个.obj文件。。。

 

对于你的问题,首先你要理解编译器是如何工作的,编译器并不是一步就生成了我们的可执行程序,

而是需要经过两步才能生成我们的.exe程序,

第一步是由编译器把.cpp文件生成.obj文件,

第二步是由链接器把所有.obj文件链接生成.exe文件(可能还需要链接外部的lib,dll和资源文件)

编译器是比较笨的,它只能帮我们作语法分析语义分析(当然不只这个,还可以帮我们优化代码...)

,它并不知道我们的程序还需要调用哪些外部的资源,它也不知道外部的资源是怎么定义的,

因为这部分的工作是由我们的链接器做的。。。

 

1.首先说明“建一个m.cpp中实现主函数,使用#include “r.h”,就能运行得到结果。”

只要在工程中添加一个*.cpp编译器就会为它生成相应的.obj文件,我们在编写程序中调用函数的时候可以并不需要知道函数的具体定义,而只需要知道它的声明(即调用方法)就可以了,.h文件就是告诉了我们,这个函数可能是在外部的.obj中定义的,因为任何语言的语法都不不充许没有声明就直接调用函数的,所以我们需要.h文件来为这个在外部定义函数作声明,那我们的程序怎么知道去哪里调用函数的主体呢??其实这部分工作是由链接器linker做的工作,linker把工程中的.cpp文件生成的“所有.obj链接在一起”生成.exe,它遇到函数声明就会去.obj中去找相应的函数定义(把目标文件中符号的定义和引用联系起来),找到了你告诉它函数的定义在哪,这样我们在程序中就知道该去哪调用。。。

2.“使用#include“r.cpp”就会报错。”

如果你使用#include "r.cpp"就会出现很多问题,即然是要定义一个类,你的类的定义和声明应该是放在r.h里实现的吧??这是一般的做法,把类的定义放在.h头文件,而类的内部成员函数的实现放在相应的.cpp文件中实现,只在.h文件中作函数的声明。。。

通过前面的介绍,你应该知道,r.cpp如果是包含在项目中的,那么它会生成相应的.obj,而你在m.cpp中使用了#include"r.cpp"它就会再次把整个r.cpp 包含进来编译,这样在m.obj和r.obj中都有r.cpp中函数的定义,也就是说函数重复定义了,链接器遇到重复定义的函数就知道程序中调用的函数该是哪一个了(即使它们两个是一模一样的,但它们存在两份,所以链接器也就无法把它们链接在一起了)

r.h中包含了r.cpp中所有类和函数的申明,而且#include后面只能接*.h,不能接*.cpp
没有#include“r.cpp”却调用了它是因为你的工程已经添加了r.cpp文件,只要在工程里面的文件都会得到编译,你只需要包含头文件就行了,系统会在连接时自动加上r.cpp而不需要你自己包含进来。假如你把工程里的r.cpp去掉(不是把工程所在文件目录下的r.cpp文件删除,而是在FileView里面删除)编译时不出错而连接时就会出错了,因为系统没有找到r.h类的实现。哪个包含#include“r.cpp”语法是没有错的,c++中的包含只要所包含的文件符合c++语法理论上都可以的,不信你自己试试看。

你的工程已经添加了r.cpp文件,只要在工程里面的文件都会得到编译的,只要你声明了就能找到。

r.h是声明 r.cpp是实现 为啥指添加r.h就可以使用了 这是因为编译器的机制
r.cpp里面一般没有完整的类声明 所以include会出错
若r.cpp里面全是函数 是可以#include "r.cpp“来访问函数的

上一个:用C++编玫瑰花
下一个:c++程序代码

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,