欢迎来到天天文库
浏览记录
ID:6605700
大小:34.50 KB
页数:11页
时间:2018-01-20
《vosal studio 教程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VosalStudio教程C++:源文件与头文件有什么区别2010-12-0609:44:55来源:网络评论:0点击:1349C++的源代码文件分为两类:头文件(Headerfile)和源文件(Sourcecodefile)。头文件用于存放对类型定义、函数声明、全局变量声明等实体的声明,作为对外接口;而源程序文件存放类型的实现、函数体、全局变量定义。对于商业C++的源代码文件分为两类:头文件(Headerfile)和源文件(Sourcecodefile)。头文件用于存放对类型定义、函数声明、全局变量声明等实体的声明,作为对外接口;而源程序文件存放类型的实现、
2、函数体、全局变量定义。对于商业C++程序库,一般把头文件随二进制的库文件发布,而源代码保留。一般情况下头文件常以.h或.hpp作为扩展名,而实现文件常以.cpp或.cc为扩展名。头文件一般不直接编译,一个源文件代表一个“编译单元”。在在编译一个源文件时,如果引用的类型、函数或其它实体不在本编译单元内,可以通过引用头文件将其它编译单元内实现的实体引入到本编译单元。而从本质上讲,这些源代码文件都是纯文本文件,可以使用任何一款文本编译器进行源代码的编辑,并没有本质的区别,这些头文与实现文件的扩展名只是一种习惯。而C++的标准库的头文件则不使用扩展名,例如strin
3、g、iostream、cstdio等头文件。对与源文件也一样,你完全可以使用.inl或.cplusplus作为文件的扩展名。事实上,在一些C++的项目中.inl被用作源代码文件的扩展名,保存内联函数,直接包含在源文件中,如ACE(theAdaptiveCommunicationEnvironment,http://www.cse.wustl.edu/~schmidt/ACE.html)等。gcc默认支持的C++源文件扩展名有.cc、.cp、.cpp、.cxx、.c++、.CPP、.C(注意后两项是大写,在Unix/Linux上的文件名是区分大小写的)。例如在
4、gcc中你可以这样编译一个扩展名为.cplusplus的C++程序:g++-xc++demo.cplusplus虽然文件名对程序没有任何影响,但.cpp和.cc这些扩展名是编译器默认支持的,使用这些扩展名您就不需要手动添加编译选项支持您使用的扩展名,如gcc中的-x选项。而实际上,头文件以什么为扩展名并没有什么影响,因为没有人会直接编译头文件,因为头文件里只有声明而没有定义,而在实际的编译过程中,#include预编译指令用到的头文件是被直接插入到源代码文件中再进行编译的,这与直接将头文件的内容复制到#include行所在的位置是没有区别的,这样就很容易理解
5、#include可以出现在文件的什么位置,显然放到一个函数体或类的定义里是不合适的。1.1.1.定义与声明有什么不同一般来讲定义要放在源代码文件中,而声明要放在头文件中。具体哪些内容应该放在源代码文件中,哪些内容应该放在头文件中,需要清楚地理解,哪些是定义,哪些是声明。1.1.1.1.类的定义与声明类的定义是定义了类的完整结构,包括成员函数与成员变量,如例程[2-1]。//例程2-1:类的定义classPoint{private:intx_;inty_;public:Point(intx,inty);intX(void)const;intY(void)con
6、st;};而类的声明,只说明存在这一种类型,但并不定义它是什么样的类型,如例程[2-2]。//例程2-2:类的声明classPoint;类的说明与实现都可以放在头文件中,因为上层代码需要使用Point的类必须知道当前工程已经定义了这个类。但应该使用定义还是声明呢?使用声明可以的地方使用定义都是可以的,但是,过多得使用定义会使项目编译时间加长,减慢编译速度,细节可参见(@seeeffectiveseries,item34)。还有一种情况是必须使用声明的,就是当两个类在定义中出现互相引用的情况时,如例程[2-3]。当然,这种情况出现的情况比较少,多数情况下也可以
7、通过修改设计尽量避免,在不可避免的情况下只能使用这种方式。//例程2-3:类定义的交叉引用classB;classA{public:B&GetB(void)const;}classB{public:A*CreateA(void)const;}类的定义只给出了类包含了哪些数据(成员变量)和接口(成员函数),但并没有给出实现,程序的实现应该放在原代码文件中。如例程[2-1]中的Point类定义在Point.hpp头文件中,相应的源代码文件Point.cpp的内容如例程[2-4]所示。//例程2-4:成员函数的实现Point::Point(intx,inty):x
8、_(x),y_(y){}intPoint::X(vo
此文档下载收益归作者所有