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

原创 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”。

VS2015使用 在同一个项目下添加多个.cs文件

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 现状, 该项目文件夹内存的文件, 选中项目,...

第六十五篇:VS工程文件中cpp、h文件在main中调用关系及如何避免出现“找到一个或多个多重定义的符号”

1、出现的问题:”error   LNK1169:   找到一个或多个多重定义的符号“的错误 2、该问题出现的场景:(假设有一个A.h,A.cpp,main,在main中调用了A.cpp文件中的函数,...

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

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

第五十七篇:VS2015建立一个完整的c++工程:头文件.h 源文件.cpp,自动生成类

菜鸟一枚,之前一直在vs中一个源程序写到底,没有使用C++变成 打开VS2015 ,新建VS win32工程,前面步骤很简单,不再阐述 下面直接开始: 新建一个VC++ win32的程序, 在源文件加...

Arduino建立自己的工程 添加头文件 添加源文件

Arduino添加自己的头文件,名称 *.h, 添加自己的源文件名称  *.cpp 第一图点击框中的按钮 第二部点击新建标签 第三步,依次输入自己的头文件名称,和源文件名称(必须为*.c...

C语言头文件和源文件的关系

编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在P...
  • sql340
  • sql340
  • 2014年11月05日 14:38
  • 651

linux内核源文件介绍以及头文件的位置

转载自:http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425357.html LINUX 内核源文件介绍以及头文件介绍 ...
  • H002399
  • H002399
  • 2015年10月05日 17:12
  • 248

C语言中,头文件和源文件的关系(转)

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段  2.词法与语法分析阶段  3.编译阶段,首先...
  • zzkner
  • zzkner
  • 2015年01月27日 22:05
  • 517

头文件与源文件

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段  2.词法与语法分析阶段  3.编译阶段,首先编译成纯汇...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:头文件和源文件关联的问题
举报原因:
原因补充:

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