*.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,外部连接(这个是默认状况),那么根据在同一个程序内不可出现
同名函数的要求,链接器会绝不留情给你一个链接错误!