首先,我们可以将所有东西都放在一个.cpp文件内.

然后编译器就将这个.cpp编译成.obj,obj是什么东西?

就是编译单元了.一个程序,可以由一个编译单元组成,

也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,

就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上

就可以分别放在一个单元,也就是cpp里面)

那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),

组成一个.exe,也就是程序了.

如果一个.cpp要用到另一个.cpp定义的函数怎么办? 只需在这个.cpp种写上他的函数声明

就可以了.其余工作由链接器帮你完成,你可以随便调用该函数.

链接器将所有的obj连接起来,但是如果碰巧有相同的函数或外部变量怎么办?他如何识别?

一般来说是不能允许在同一个程序中,出现两个一样的函数名或外部变量名.

但是只得庆幸的是,c++可以通过一种叫做链接属性的关键字来限定,你这个函数是属于整个程序

公用的,还是只是在一个编译单元obj里面使用的.

这些关键字就是extern 和 static; extern是外部链接的意思,也就是除了这个单元,外部的单元

也是能够访问这个函数的.static 是内部链接,自属于自己单元.

说了这么久,还没有说.h的作用呢?

其实没有.h也能很好的工作,但是当你发现一个外部链接的函数或外部变量,需要许多份

声明,因为c++这种语言,在使用函数和变量的时候,必须将他声明,为何要声明?声明之后才

知道他的规格,才能更好的发现不和规格的部分.你别妄想一个编译单元,会自动从另一个

编译单元那里得到什么信息,知道你是如何定义这个函数的.

所以说,只要使用到该函数的单元,就必须写一份声明在那个.cpp里面,这样是不是很麻烦,

而且,如果要修改,就必须一个一个修改.这真让人受不了.

.h就是为了解决这个问题而诞生,他包含了这些公共的东西.然后所有需要使用该函数的.cpp,只需要

用#include包含进去便可.以后需要修改,也只是修改一份内容.

请注意不要滥用.h,.h里面不要写代码,.h不是.cpp的仓库,什么都塞到里面.

如果在里面写代码,当其他.cpp包含他的时候,就会出现重复定义的情况,

比如将函数func(){printf};放到头文件a.h,里面还有一些a.cpp需要的声明等;

然后你发现b.cpp需要用到a.cpp里面的一个函数,就很高兴的将a.h包含进来.

注意,#include并不是什么申请指令,他就是将指定的文件的内容,原封不动的拷贝

进来.

这时候实际上a.cpp和b.cpp都有一个func()函数的定义.

如果这个函数是内部链接static的话,还好,浪费了一倍空间;

如果是extern,外部链接(这个是默认情况),那么根据在同一个程序内不可出现

同名函数的要求,连接器会毫不留情给你一个连接错误!

转载于:https://www.cnblogs.com/zhangzt/archive/2013/04/25/3042654.html

.h和.cpp文件的区别 .相关推荐

  1. 转.h和.cpp文件的区别

    关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有 ...

  2. C程序保存为.c文件和.cpp文件的区别

    在学习数据结构时,看到老师把C语言和C++混用,并将文件保存为.cpp类型.关于.c文件和.cpp文件的区别,以下是我的一点看法: 1.首先应该明白,C++是在C语言的基础上拓展而来的,因此C++的语 ...

  3. .h和.c文件的区别到底是什么(精确讲解)

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

  4. .h与.hpp文件的区别

    c++中的.hpp文件 hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中 ...

  5. .h 与.hpp文件的区别

    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接 ...

  6. string/string.h/cstring头文件的区别摘要

    1. #include <cstring>   //不可以定义string s:可以用到strcpy等函数 using   namespace   std; #include <st ...

  7. 把Qt的界面文件(.ui文件)生成源文件(.h或.cpp)封装成链接库

    前言 在用Qt做开发时,为了方便快速,一般都使用Qt设计师界面类来做界面相关的布局,这个类在当前工程中是没有.cpp或.h文件的,但主类又有引入了这个头文件,点开转到定义或声明时,是打不开的,如下图: ...

  8. C++中的 .h 和 .cpp 区别详解

    2019独角兽企业重金招聘Python工程师标准>>> 在C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理和分析.于是,在C++中就要分出了头(.h)文件和实现( ...

  9. C++中头文件(.h)和源文件(.cpp)都应该写些什么

    原文出处:https://www.cnblogs.com/fenghuan/p/4794514.html 头文件(.h): 写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, ...

  10. Ardunino——面向对象语言学习篇5——.h文件和.cpp文件(制作Arduino类库)

    学习自:太极创客. 实践是检验真理的唯一标准,通过arduino进行实践学习C++或许是一个不错的选择. 前篇回顾   前篇学习了构造函数与析构函数,总体来说就是对象创建和消失时候要执行得函数. 前提 ...

最新文章

  1. android支持第三方jar包,以及Eclipse如何导入jar包
  2. 求素数的方法完整归纳,学的不仅是“求素数”!
  3. Android 获取包名,版本信息及VersionName名称
  4. 第11章 进入保护模式
  5. python excel操作库,可能是全网最完整的 Python 操作 Excel库总结!
  6. C语言 va_arg 宏 - C语言零基础入门教程
  7. 你真的会玩SQL吗?你所不知道的 数据聚合
  8. iphone11系列的尺寸_揭秘iPhone12日常使用的2大隐患:还不如iPhone11?|iphone11|iphone12|电池|手机|电池容量|iphone...
  9. python35个关键字_Python必须了解的35个关键词
  10. java用io流存信息_Java io流的学习
  11. USB大容量存储设备无法启动--这个设备(服务)的驱动程序已被禁用。另一个驱动程序可以提供这个功能。 (代码 32)
  12. 夜晚图像的目标检测-matlab
  13. 笔记本电脑wifi图标消失解决
  14. python扫雷 高级算法_Python玩转算法—扫雷
  15. 开启七牛云CDN免费HTTPS支持
  16. stm32F407 连接 对射式红外对管 样例
  17. 怎么建立客户的小档案?
  18. 怎么下载ysscloud_小米8游戏加速怎么添加桌面
  19. Lync 2010 升级到2013 之安装准备!
  20. 浙政钉踩坑记录:真机调试-H5APP 不存在

热门文章

  1. 并行分布式运维工具pdsh
  2. Repeater绑定数据库
  3. 天天生鲜项目实战-思路 数据库设计
  4. laravel中get()与 first()区别、collection与stdClass的区别
  5. window命令行启动Mysql并安装服务
  6. oracle知识小结二
  7. 《学习opencv》笔记——关于一些画图的函数
  8. 避免内存泄露及内存的规范化使用
  9. NEsper Nuget包
  10. 如何利用缓存提高asp.net网站访问速度