(对标题的解释:标题中的“源文件”是狭义的概念。为了区分,把.h文件称为“头文件“,把.cpp文件称为“源文件“。)
一、源文件如何根据#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”。
文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/c++/cppsl/200861/118782.html
分享到:
相关推荐
linux下posix标准的正则表达式库,支持regcomp, regexec等,可以放到vs2010或vs2012下进行编译。
linux下的C语言正则表达式头文件和源文件: regex.h regex.cpp
visual studio 开发环境不能用快捷键切换头文件和源文件,给编程者带来了很大不便,本文就给出了,解决办法,按照本文操作,可以简单实现此功能。本文是在自己实现了后,然后在这里和大家分享,转点积分的。
C++中的头文件和源文件详解 一、C++编译模式 通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++...
特别是对源文件和头文件的概念,需要深入对它了解: 关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一...
图像处理书中常见的DIB图像处理类,包括了头文件和源文件
有这个东东 调用MD5就方便多了~ 将压缩包解开在工程中添加如下文件 //cpp文件 md5.cpp //h文件 md5.h 就能调用进行MD5的加密了...
C++ ,VS2010平台编辑,下载后可以直接使用,包含头文件和源文件
头文件与源文件切换切换的SourceInsight宏,switch_cpp_hpp宏有一定的限制(要求在同一目录下),如源码结构为src、include、test时,include下头文件与src下源文件之间就不能实现切换。SwitchCppAndHpp宏对目录再...
所以cpp文件只包含StdAfx.h 使用方法: char tmp[128]=""; //要加密的字符串 unsigned char digest[16];//加密后的中间字符串 char value[350]="";//最终结果 MD5_CTX context; strcpy(tmp,mSpass.GetBuffer(mSpass...
文本文件是指以纯文本格式存储的文件,例如用QtCreator编写的c++程序的头文件(.h文件)和源程序文件(.cpp文件)。HTML和XML文件也是纯文本文件,只是其读取之后需要对内容进行解析之后再显示。 Qt提供了两种读写...
能得找bug找了大半天,但是还是坚持的心态把问题给解决了,比如需要哪几个文件,需要sqlite3.dll、sqlite3.lib、sqlite3i.h、sqlite3.hDbsqlite.h、Dbsqlite.cpp这些都是已经封装好的,把这些文件发到工程的同一目录...
资源是已经生成好的文件,是可直接包含使用的 jsoncpp 头文件(.hpp)和源文件(.cpp)
一、什么是QT? Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,包括Qt、...如此新建的项目 samp2_2 有一个界面文件 qwdialog.ui,一个头文件 qwdialog.h 和源程序文件 qwdialog.cpp。此外,还有项目文
如何创建QT项目之QTcreator输出HelloWorld,小白保姆级别的教程,...在项目中,找到主窗口类(通常是MainWindow)的头文件(.h)和源文件(.cpp)。在源文件中,添加一个QLabel对象,并设置其文本为“Hello World”。
CryEngine.Entity.h.zip 基本实体组件的头文件模板(EntityComponentHeaderTemplate.h)CryEngine.Entity.cpp.zip 基本实体组件的源代码模板(EntityComponentSourceTemplate.cpp)CryEngine.Entity.FlowNode.h.zip ...
整个源代码作为一个C ++头文件QSNMP.h和源QSNMP.cpp文件提供,以便于直接在应用程序中轻松集成。 本质上,QSNMP封装了Net-SNMP库的子代理API,用于使用AgentX协议与SNMP主代理snmpd交换SNMP获取,设置和通知消息。 ...
电脑上没有tree命令,也不大敢截图,将就着看看,其中build是cmake编译指定的路径,addlib下面也有一个头文件和源文件 ,还有一个CmakeLists.txt,可以看下: CMake Lists.txt library.cpp library.h 先看各个文件...
二进制数据文件将转换为HEX表示形式,并存储在“ resource.h”和“ resource.cpp”文件中