.h和.cpp文件的区别

*.c 即 C 语言程序源文件

*.cpp 即 C Plus Plus C++ 源文件
c++

===============================================web

 

关于头文件和源文件的分别函数

 

首先,咱们能够将全部东西都放在一个.cpp文件内.post

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

就是编译单元了.一个程序,能够由一个编译单元组成,orm

也能够有多个编译单元组成. 若是你不想让你的源代码变得很难阅读的话,ci

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

就能够分别放在一个单元,也就是cpp里面)it

    那么就是一个.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,外部连接(这个是默认状况),那么根据在同一个程序内不可出现

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

相关文章
相关标签/搜索