头文件和源文件关联的问题

原创 2007年09月30日 14:55:00
    (对标题的解释:标题中的“源文件”是狭义的概念。小弟只是为了区分,把.h文件称为“头文件“,把.cpp文件称为“源文件“。)

    今天有个同事来问我#include <xxx.h>和#inlcude “xxx.h”的区别(关于这个问题,网上已经说滥了,而且林锐博士的《高质量C++/C编程指南》也作了说明)。从这个问题,偶引申出好几个问题,不得已,又去往上”狗狗”了(惭愧的很啊,每次都只能去”狗狗”…>_<…),现将我引申出的问题和解答总结一下,供大家学习或指正。

一、源文件如何根据#include来关联头文件?

1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。

#include <xxx.h>

2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找。

#include “xxx.h”

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

    这个问题实际上是说,已知头文件“a.h”声明了一系列函数,“b.cpp”中实现了这些函数,那么如果我想在“c.cpp”中使用“a.h”中声明的这些在“b.cpp”中实现的函数,通常都是在“c.cpp”中使用#include “a.h”,那么c.cpp是怎样找到b.cpp中的实现呢?


    其实.cpp和.h文件名称没有任何直接关系,很多编译器都可以接受其他扩展名。比如偶现在看到偶们公司的源代码,.cpp文件由.cc文件替代了。

    在Turbo C中,采用命令行方式进行编译,命令行参数为文件的名称,默认的是.cpp和.h,但是也可以自定义为.xxx等等。

    谭浩强老师的《C程序设计》一书中提到,编译器预处理时,要对#include命令进行“文件包含处理”:将file2.c的全部内容复制到#include “file2.c”处。这也正说明了,为什么很多编译器并不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中指定的那个可以执行文件中。

    在Unix下,甚至可以不在源文件中包括头文件,只需要在makefile中指名即可(不过这样大大降低了程序可读性,是个不好的习惯哦^_^)。在VC中,一帮情况下不需要自己写makefile,只需要将需要的文件都包括在project中,VC会自动帮你把makefile写好。

    通常,编译器会在每个.o或.obj文件中都去找一下所需要的符号,而不是只在某个文件中找或者说找到一个就不找了。因此,如果在几个不同文件中实现了同一个函数,或者定义了同一个全局变量,链接的时候就会提示“redefined”。

头文件和源文件在不同目录情况下 Makefile自动推导依赖关系的实现

参考 跟我一起写Makefile http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225&extra=&authorid=106107...
  • shun01
  • shun01
  • 2014年04月04日 16:40
  • 2318

C# .NET4.0 自定义文件并实现文件与应用程序关联

一、如何创建自定义后缀名的文件(如 *.tmp)?    使用序列化将一个对象序列化成文件,使用 BinaryFormatter 类提供方法可以将文件序列    化为二进制文件存放。    注意:待序...
  • yja886
  • yja886
  • 2010年11月07日 17:47
  • 2672

实现MATLAB2016a和M文件关联

新安装MATLAB2016a之后,发现MATLAB没有和m文件关联 每次打开m文件后都会重新打开一次MATLAB主程序后来发现这样的办法,亲测有效 下载压缩包:http://pan.baidu.c...
  • qq_22186119
  • qq_22186119
  • 2016年04月04日 10:40
  • 16891

理解C++中的头文件和源文件的作用

一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是...
  • yue34257667
  • yue34257667
  • 2015年05月05日 12:14
  • 5579

头文件与同名源文件的关系

1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。 #include 2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中...
  • lee244868149
  • lee244868149
  • 2014年09月17日 13:51
  • 1559

解决MATLAB2016b不能与M文件关联的问题

MATLAB2016b不能与M文件关联 最近安装MATLAB 2016b之后,发现不能自动关联.m格式的文件。每次双击.文件都不能找到MATLAB打开,只能先打开MATLAB软件,然后再找到m文件打...
  • u013829973
  • u013829973
  • 2018年01月20日 23:09
  • 182

windows的exe、lib文件跟c运行时库怎么关联的

2015-11-2 09:22:02 Am Monday 嗨,周一。一个新的工作周的开始。在Windows操作系统下,可执行文件的存储格式是PE(Portable Executable)格式的;在L...
  • mofabang
  • mofabang
  • 2015年11月02日 11:34
  • 885

VS头文件 源文件切换

问题:头文件和源文件之间使用快捷键切换,可以提高工作效率。本例,设置快捷键:Alt+F2 操作步骤如下: 1.打开:工具—》宏—》宏 IDE,如图1: 图1 2.添加模块,这里模块名称...
  • lijian19911012
  • lijian19911012
  • 2014年03月13日 09:05
  • 2051

关于编译与链接具体内容及头文件与源文件区别的理解

C++编译器针对每个.cpp文件进行单独编译,在某.cpp文件编辑窗口下进行编译操作时,该.cpp文件编译生成同名的.obj文件,通过对比工程目录文件夹内容即可验证。 链接时,编译器自动编译每一个....
  • Alex123980
  • Alex123980
  • 2016年05月31日 16:01
  • 726

[c++ 温故知新] c++ 头文件和cpp文件关系

上学的时候,学习c++接触到头文件和cpp文件。一开始始终无法理解,为什么会有这两种文件,这两种文件有啥作用? 简单理解的话:      头文件中存放函数的声明,cpp文件中存放定义 为...
  • hzk745
  • hzk745
  • 2015年12月27日 16:19
  • 502
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:头文件和源文件关联的问题
举报原因:
原因补充:

(最多只允许输入30个字)