当前位置: 主页 > 日志 > C/C++ >

头文件与源文件


头文件的功能?

   (1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
   (2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
头文件用来存放函数原型。

头文件如何来关联源文件?

       这个问题实际上是说,已知头文件“a.h”声明了一系列函数(仅有函数原型,没有函数实现),“b.cpp”中实现了这些函数,那么如果我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢? 
      其实.cpp和.h文件名称没有任何直接关系,很多编译器都可以接受其他扩展名。 
     谭浩强老师的《C程序设计》一书中提到,编译器预处理时,要对#include命令进行“文件包含处理”:将headfile.h的全部内容复制到#include “headfile.h”处。这也正说明了,为什么很多编译器并不care到底这个文件的后缀名是什么----因为#include预处理就是完成了一个“复制并插入代码”的工作。 
      程序编译的时候,并不会去找b.cpp文件中的函数实现,只有在link的时候才进行这个工作。我们在b.cpp或c.cpp中用#include “a.h”实际上是引入相关声明,使得编译可以通过,程序并不关心实现是在哪里,是怎么实现的。源文件编译后成生了目标文件(.o或.obj文件),目标文件中,这些函数和变量就视作一个个符号。在link的时候,需要在makefile里面说明需要连接哪个.o或.obj文件(在这里是b.cpp生成的.o或.obj文件),此时,连接器会去这个.o或.obj文件中找在b.cpp中实现的函数,再把他们build到makefile中指定的那个可以执行文件中。 
    在VC中,一帮情况下不需要自己写makefile,只需要将需要的文件都包括在project中,VC会自动帮你把makefile写好。 
   通常,编译器会在每个.o或.obj文件中都去找一下所需要的符号,而不是只在某个文件中找或者说找到一个就不找了。因此,如果在几个不同文件中实现了同一个函数,或者定义了同一个全局变量,链接的时候就会提示“redefined”

例如:下面是一个交换两个数值的程序.整个程序共有三个文件,分别是主程序文件 Main.cpp,头文件xchange.h,函数实现Implementation.cpp。

主程序文件Main.cpp// (main函数所在文件)

#include <iostream.h>
#include "xchange.h" //xchange函数的函数原型
void main()
{
int a,b;
a=1;
b=2;
cout<<"a="<<a<<","<<"b="<<b<<endl;
xchange(a,b);
cout<<"a="<<a<<","<<"b="<<b<<endl;
return;
}

//头文件xchange.h

void xchange(int &a,int &b); // xchange函数原型声明

//xchange函数显现 Implementation.cpp

void xchange(int &a,int &b)
{
int c;
c=a;
a=b;
b=c;
return;
}

[日志信息]

该日志于 2009-02-26 15:08 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “头文件与源文件” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部