`
zy77612
  • 浏览: 284205 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

头文件.h和源文件.cpp的关系

 
阅读更多

(对标题的解释:标题中的“源文件”是狭义的概念。为了区分,把.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下的C语言POSIX正则表达式头文件和源文件: regex.h regex.cpp

    在本主题中,我们将探讨`regex.h`头文件和`regex.cpp`源文件,以及如何在Visual Studio 2010或2012环境下编译它们。 首先,`regex.h`是包含POSIX正则表达式函数声明的头文件。在Linux中,这个头文件定义了几个关键...

    visual studio 中如何设置头文件与源文件切换

    在Visual Studio中,开发C++项目时经常需要在头文件(.h)和源文件(.cpp)之间频繁切换,这对于提高开发效率至关重要。然而,Visual Studio默认并未提供快捷键来实现这一功能,这给程序员带来了不便。为了解决这个...

    linux QT 自动生成.h和.cpp文件的编译脚本程序

    在Linux环境下,使用QT进行开发时,我们常常需要创建头文件(.h)和源文件(.cpp),以便实现特定的功能。为了提高开发效率,我们可以编写自动化脚本来完成这个过程。这里的"linux QT 自动生成.h和.cpp文件的编译...

    regex.h regex.cpp

    在本案例中,"regex.h" 和 "regex.cpp" 是两个关键文件,它们分别代表了C语言中处理正则表达式的头文件和源文件。 `regex.h` 头文件是C语言中使用正则表达式的关键接口,它包含了所有与正则表达式相关的函数声明和...

    windows atl 族类头文件

    使用这些头文件和源文件,开发者可以在Windows平台上构建各种类型的应用,包括COM组件、ActiveX控件、数据库客户端、Web服务客户端和服务器等。由于Windows 10系统本身不包含这些头文件,开发者需要单独下载并集成到...

    H文件生成CPP文件工具

    在实际使用这个工具时,开发者需要了解如何正确地配置和运行MakeCPP.exe,理解头文件和源文件之间的关系,以及如何在C++中组织代码结构。此外,对于生成的源文件,开发者还需要考虑适当的版权信息、包含保护(防止...

    C++中的头文件和源文件.rar

    头文件和源文件之间的关系可以通过链接过程来理解。编译器分别处理每个源文件,生成目标文件(.o或.obj)。然后,链接器将这些目标文件与库文件连接起来,创建最终的可执行文件。在这个过程中,头文件的作用是在编译...

    C++中的头文件和源文件[参考].pdf

    C++ 编程语言中有两种基本文件类型:源文件(.cpp 文件)和头文件(.h 文件)。源文件中包含 C++ 源代码,而头文件中也包含 C++ 源代码,但头文件不需要编译。头文件的作用是提供函数和变量的声明,使得编译器可以...

    C++中的头文件和源文件.pdf

    C++ 编程语言中有两种主要的文件类型:源文件(.cpp)和头文件(.h)。源文件用于存放 C++ 源代码,而头文件用于存放函数和变量的声明。这种机制使得 C++ 程序员可以更方便地编写和维护大型程序。 头文件的作用是将...

    运行xml文件的类AnimatePacker.h、AnimatePacker.cpp、Singleton.h

    AnimatePacker.h和AnimatePacker.cpp是一对头文件和源文件,通常在C++项目中用于定义和实现特定的功能。AnimatePacker可能是负责解析和操作XML动画数据的类。在头文件(.h)中,它可能会声明类的结构,包括成员变量...

    CvvImage头文件和源文件

    "CvvImage"头文件(CvvImage.h)包含了类CvvImage的定义,这个类是对OpenCV的IplImage或cv::Mat类的封装,使得在MFC环境中使用OpenCV的图像处理功能变得更加简单。CvvImage.cpp文件则包含了CvvImage类的实现,包括...

    PrintIe头文件和源文件

    PrintIe头文件和源文件是开发过程中用来实现跨进程调用Internet Explorer(IE)打印功能的关键组件。在Windows编程中,尤其是涉及到与浏览器交互时,这种技术非常常见。这里,`CPrintIE.h`是头文件,包含了类定义和...

    C++中头文件和源文件详细介绍

    在C++编程中,头文件(.h文件)和源文件(.cpp文件)是构建程序的基本元素。了解它们的工作原理对于编写高效、可维护的代码至关重要。 首先,C++的编译模式采用“分别编译”的策略。这意味着一个程序可以分散在多个...

    VC MD5头文件和源文件

    在VC++环境中,如果你需要使用MD5功能,通常需要包含相关的头文件和源文件。在提供的资源中,"md5.cpp"和"md5.h"就是这样的文件。`md5.cpp`包含了MD5算法的具体实现,而`md5.h`则定义了相关的接口和数据结构,使得你...

    Source Insight宏 - 头文件与源文件切换

    头文件与源文件切换切换的SourceInsight宏,switch_cpp_hpp宏有一定的限制(要求在同一目录下),如源码结构为src、include、test时,include下头文件与src下源文件之间就不能实现切换。SwitchCppAndHpp宏对目录再...

    DIB图像处理类(包括头文件和cpp文件)

    本资源包含了一个DIB图像处理类的实现,包括头文件`DIBAPI.H`和源文件`DIBAPI.CPP`。 在`DIBAPI.H`中,我们通常会看到类的声明和相关函数原型。这个类可能包含了创建、读取、写入以及操作DIB位图的各种方法。例如,...

    MD5源码头文件和源文件以及使用说明

    所以cpp文件只包含StdAfx.h 使用方法: char tmp[128]=""; //要加密的字符串 unsigned char digest[16];//加密后的中间字符串 char value[350]="";//最终结果 MD5_CTX context; strcpy(tmp,mSpass.GetBuffer(mSpass...

    example_dsp.rar_DSP28335头文件和源文件_votetu5

    总结,`example_dsp.rar_DSP28335头文件和源文件_votetu5`提供的资源对于理解和开发基于DSP28335的项目至关重要。通过头文件了解功能接口,通过源文件实现功能,结合特定版本的开发工具,开发者可以更高效地利用DSP...

    2407头文件

    例如,`TMSPower.h`可能是电源管理的相关头文件,`TMSSI2C.h`可能是I2C通信的头文件。头文件的主要作用是提供编译时的类型检查和避免代码重复,使得代码结构清晰,便于维护。 接下来是CMD文件。在TI的CCS(Code ...

Global site tag (gtag.js) - Google Analytics