`
zhaohaolin
  • 浏览: 1020418 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

C++基础之头文件和源文件的关系

 
阅读更多

今天找了个解析xml的开源C++ 项目tinyxml,按照网上的说法去编译,但是一直编译不通过,“无法打开头文件tinyxml.h”,但是明明我在工程底下有了这个文件,对于我这种初学C++ 的人来说我并不知道头文件和源文件到底什么关系(不像java的类文件),不过最终还是解决了这个问题。
  一、源文件如何根据#include来关联头文件
  1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找。
  #include
  2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找。
  #include “"xxx.h”(我一直以为””和<>没什么区别,但是tinyxml.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”。

 

一、声明与定义的区分:
  一个声明就是一个定义,除非 :
  声明:引入名称
  定义:引入实体
  它声明了一个没有详细说明函数体的函数
  它包含一个extern定义符且没有初始化函数或函数体
  它是一个包含在一个类定义之内的静态类数据成员的声明,它必须在最终程序的某处准确的定义一次
  它是一个类名声明,如class test;
  它是一个typedef声明。
  言外之意:
  1。类的声明也就是定义
  2。同时赋初值的声明也就是定义,如
 
  3。类非静态数据成员的声明也就是定义???
  4。类的所有成员函数的声明也就是定义
  一个定义就是一个声明,除非:
  1.它定义的是一个静态数据成员
  2.它定义了一个非内联成员函数
  内部连接和外部连接:
  编译时每个文件会被编译成一个含有必要信息的源文件(又叫编译单元),然后编译单元会联结成一个和族文件同名的.o文件,.o文件把不同的编译单元中产生的符号联系起来,构成一个可执行文件。有两种截然不同的链接:内部的和外部的,将这些编译单元联系起来。
  内部连接:对这个定义的访问被局限在当前编译单元,其他编译单元无法访问。
  外部连接:可被其他单元访问,因此名称在整个执行文件中必须唯一。
  类的定义(同时也是声明),enum,struct,都是内部连接,内联函数,静态的非类成员数据也是
  typedef声明的类型也是内联结。
  非内联成员函数(包括静态成员)有外部连接,非内联函数,非静态自由函数(非类的成员函数)也是外连接。
  声明只对当前编译单元有用,他们不会影响到.o文件,
  .h文件,由于该文件会被其他.cpp文件包含,但由于声明只是对当前编译单元有效,是不会将符号引入.o文件,所以该文件不能含有任何外部连接的符号(数据成员和函数)的定义。一般情况下也不要包含内连接符号的定义。

 

综上所诉:
  .h文件中能包含:
  类成员数据的声明,但不能赋值
  类静态数据成员的定义和赋值,但不建议,只是个声明就好。
  类的成员函数的声明
  非类成员函数的声明
  常数的定义:如:const int a=5;
  静态函数的定义
  类的内联函数的定义
  不能包含:
  1. 所有非静态变量(不是类的数据成员)的声明
  2。 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在.h文件中使用std::string

分享到:
评论

相关推荐

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

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

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

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

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

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

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

    在C++编程中,头文件(....总之,C++中的头文件和源文件是协同工作的,头文件提供了接口,源文件提供了实现。这种结构使得代码更易于组织和重用,同时提高了编译效率。理解它们的用法和规则是成为熟练C++程序员的基础。

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

    有了这个宏,Visual Studio用户现在可以轻松地在头文件和源文件之间切换,提高编程效率。不过需要注意的是,这个宏可能不会完美适用于所有情况,比如当文件命名规则不遵循cpp/h模式或者文件不在当前工作空间中时。但...

    基于C++有头文件和源文件的最大值求取问题

    在这个题目中,“基于C++有头文件和源文件的最大值求取问题”旨在教你如何通过这种方式来解决一个实际问题——求取一组数据中的最大值。 首先,我们来看`Text1.h`这个头文件,它可能包含了类的定义,例如一个名为`...

    一个头文件和源文件分离的小工具

    4. **头文件和源文件的分离**:在C++中,头文件通常包含函数声明、类定义和其他接口信息,而源文件则包含函数实现和类的成员函数。分离头文件和源文件可以提高编译效率,避免循环依赖,并使代码更易于维护。在本项目...

    ado数据库开发头文件和源文件

    c++ ado sqlser2000 在MFC数据库开发中添加该头文件和源文件,数据库接口已经封装好,而且经过测试

    linux下的C语言POSIX正则表达式头文件和源文件: regex.h regex.cpp

    2. 将`regex.cpp`文件添加到项目中。 3. 在项目的属性页中,转到“配置属性” -&gt; “C/C++” -&gt; “预处理器”,在“预处理器定义”中添加`_GNU_SOURCE`。这将启用POSIX扩展,包括`regex.h`中的函数。 4. 同样在属性页...

    PrintIe头文件和源文件

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

    CvvImage头文件和源文件

    MFC(Microsoft Foundation Classes)是微软提供的一个C++库,用于构建Windows应用程序,而OpenCV(Open Source Computer Vision Library)则是一个强大的开源计算机视觉库,支持多种图像和视频处理任务。...

    C++中头文件与源文件的作用详解

    C++编程语言中,头文件和源文件是两个非常重要的概念,它们之间的关系和作用是C++程序员需要掌握的基本知识。本文将详细介绍C++中头文件和源文件的作用、编译模式、头文件的定义和使用等内容。 一、C++编译模式 在...

    顺序表C++头文件和测试代码

    顺序表的实现通常包括两个部分:头文件(.h)和源文件(.cpp)。头文件中定义了顺序表的类结构,包括数据成员和成员函数的声明;源文件则包含了这些函数的实现。在这个项目中,"顺序表"可能包含以下内容: 1. **...

    2407头文件

    在进行TMS320LF2407A相关的项目开发时,头文件、CMD文件和源文件是必不可少的组成部分,它们构成了整个工程的基础框架。 首先,我们来了解头文件(Header Files)。头文件通常以`.h`为扩展名,它们包含了程序中需要...

    c++转换成c#代码

    C++和C#是两种不同的编程语言,各自拥有独特的特性和设计哲学。C++起源于C语言,强调底层控制和性能优化,而C#由微软开发,是面向对象的、类型安全的语言,常用于现代应用程序和游戏开发。将C++代码转换为C#代码涉及...

    C++头文件手册

    10. **头文件组织**:良好的项目结构应将相关的头文件和源文件组织在一起,如将所有类的头文件放在`include`目录下,源文件放在`src`目录下,便于管理。 通过深入理解和有效利用这些头文件,开发者可以更好地利用...

    1602头文件及源文件和protues仿真

    头文件是C或C++编程中用于定义函数原型、数据结构和常量的文件,通常以`.h`为扩展名。在1602 LCD的应用中,头文件通常包含对LCD模块的操作函数声明,如初始化、写字符、清屏等。这些函数使程序员能方便地与1602 LCD...

    C++头文件转源文件工具

    在C++编程中,头文件(.h)和源文件(.cpp)是程序结构的基础元素。头文件通常包含类定义、函数声明和其他接口信息,而源文件则包含函数实现和类成员的具体代码。然而,在某些情况下,开发者可能需要将头文件中的...

Global site tag (gtag.js) - Google Analytics