一、源文件如何根据#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”。 
声明与定义的区分: 
一个声明就是一个定义,除非 :
声明:引入名称
定义:引入实体
1.它声明了一个没有详细说明函数体的函数
2.它包含一个extern定义符且没有初始化函数或函数体
3.它是一个包含在一个类定义之内的静态类数据成员的声明,它必须在最终程序的某处准确的定义一次
4.它是一个类名声明,如class test;
5.它是一个typedef声明。 
言外之意:
1。类的声明也就是定义
2。同时赋初值的声明也就是定义,如int a=2;
3。类非静态数据成员的声明也就是定义???
4。类的所有成员函数的声明也就是定义 
一个定义就是一个声明,除非:
1.它定义的是一个静态数据成员
2.它定义了一个非内联成员函数 
内部连接和外部连接:
编译时每个文件会被编译成一个含有必要信息的源文件(又叫编译单元),然后编译单元会联结成一个和族文件同名的.o文件,.o文件把不同的编译单元中产生的符号联系起来,构成一个可执行文件。有两种截然不同的链接:内部的和外部的,将这些编译单元联系起来。
内部连接:对这个定义的访问被局限在当前编译单元,其他编译单元无法访问。
外部连接:可被其他单元访问,因此名称在整个执行文件中必须唯一。

类的定义(同时也是声明),enum,struct,都是内部连接,内联函数,静态的非类成员数据也是
typedef声明的类型也是内联结。 
非内联成员函数(包括静态成员)有外部连接,非内联函数,非静态自由函数(非类的成员函数)也是外连接。 
声明只对当前编译单元有用,他们不会影响到.o文件, 
  
.h文件,由于该文件会被其他.cpp文件包含,但由于声明只是对当前编译单元有效,是不会将符号引入.o文件,所以该文件不能含有任何外部连接的符号(数据成员和函数)的定义。一般情况下也不要包含内连接符号的定义。 
  
综上所诉: 
.h文件中能包含:
 
1。类成员数据的声明,但不能赋值 
2.类静态数据成员的定义和赋值,但不建议,只是个声明就好。
3。类的成员函数的声明
4。非类成员函数的声明 
5.常数的定义:如:const int a=5; 
6.静态函数的定义 
7.类的内联函数的定义 
  
不能包含: 
1.  所有非静态变量(不是类的数据成员)的声明 
2。 默认命名空间声明不要放在头文件,using namespace std;等应放在.cpp中,在.h文件中使用std::string

C++头文件和源文件的关系相关推荐

  1. 头文件和源文件的关系

    一.关于头文件和源文件之间的关系,理解把握要点在于: 1.头文件是给编程开发人员看的,而源文件是给编译器看的: 2.在#include头文件时,编译器直接把相应的头文件复制粘贴到源文件的相应位置: 3 ...

  2. C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用

    1. C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件: .cpp 文件,被称作 C++ 源文件,里面放的都是 C++ 的源代码 .h 文件,被称作 C++ 头文件,里面放的也是 C++ ...

  3. C++头文件和源文件,编译过程

    源文件如何根据#include来关联头文件  1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来, ...

  4. C++头文件和源文件的编译过程

    源文件如何根据#include来关联头文件 1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来,编 ...

  5. C语言头文件和源文件差异,#include两种引用方式差异

    一些初学c语言的人,不知道头文件(*.h文件)原来还可以自己写的.只知道调用系统库函数时,要使用#include语句将某些头文件包含进去.其实,头文件跟.c文件一样,是可以自己写的.头文件是一种文本文 ...

  6. 结合编译过程,分析C++头文件和源文件的区别

    编译过程 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 预处理阶段 词法与语法分析阶段 编译阶段,首先编译成纯汇编语句,再 ...

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

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

  8. html 头文件含义,头文件和源文件的区别是什么?

    头文件和源文件的区别 头文件和源文件在本质上没有任何区别. 只不过一般:后缀为 .h 的文件是头文件,内含函数声明.宏定义.结构体定义等内容.后缀为 .c 的文件是源文件,内含函数实现,变量定义等内容 ...

  9. C++:include:理解 C++ 中的头文件和源文件的作用

    关于头文件和源文件我们主要围绕: C++编译模式, 声明和定义区别, 符号只能被定义一次, 符号被定义在多个源文件,但是一个源文件只能定义一次 这四个方面来分析论述 1:C++ 编译模式 在一个C++ ...

  10. c 中头文件和源文件的区别是什么

    区别:头文件是".h"文件,提供接口:源文件是".cpp"文件,提供实现.编译器规定源文件必须包含函数入口,即main函数:而头文件不得包含函数入口,头文件不可 ...

最新文章

  1. iOS之CAEmitterLayer粒子引擎
  2. mysql如何实现读提交锁_MySQL学习笔记(二)—MySQL事务及锁详解
  3. java发送加密报文_RSA加密---从后台到客户端实现报文加解密
  4. 珠海一中高考2021成绩查询,2020珠海高考成绩出炉!多所高中高考成绩单流出
  5. boost::safe_numerics::interval相关的测试程序
  6. java python混合开发_Go+Python双语言混合开发
  7. java客户端作为kafka生产者测试
  8. 由一道习题看如何设计浮点数
  9. 斐波那契数列【java实现】
  10. Android代码 listview选中,Android开发listview选中高亮简单实现代码分享
  11. 单片机蜂鸣器唱歌c语言程序,STC89C52单片机蜂鸣器唱歌实验
  12. 手机APP测试主要有哪些内容
  13. 宿舍物联网门锁系统之个人小程序注册
  14. Android - 控件android:ems属性
  15. C++:[编程题]买帽子
  16. deadmau5 《光之塔》 NFT 系列来袭!
  17. 【中国人口金字塔2019,python,pandas,matplotlib,numpy 】
  18. 大数据——MapReduce基础(MapReduce概念)
  19. 自定义Drawable:实现文字生成图片
  20. 【七七八八】疫情期间谈谈我的转变

热门文章

  1. 多线程一定比单线程效率更高吗?
  2. 程序员与动画师合作的一些感想
  3. Windows 常用系统检测命令
  4. GOOGLE学术搜索技巧
  5. 计算机软件著作权取得方式,著作权取得主要有两种方式是什么
  6. JPCSP源码解读14:动态二进制翻译2
  7. [Android 测试] 压力稳定性测试之: Monkey 详解分析脚本
  8. ChatGPT横空出世|超强大功能写代码、写情书、写文章、做设计火爆全网
  9. MATLAB仿真 铰链四连杆运动分析,曲柄摇杆,四连杆机构,曲柄+RRR杆组组成,曲线分析
  10. echarts使用:X轴不从0开始