其实,网上有很多类似的文章,随便百度一下就可以查明白,虽然明白,但我还是帮你百度了一下系统的文章。
C++/C源程序通常分为两类文件。一类文件用于保存程序的声明,称为头文件;另一类文件用于
保存程序的实现,称为源文件(或者定义文件)。
编译器在扫描到一条函数调用语句时首先应当知道该函数的原型或定义,函数原型一般都放在头文件中,函数定义则放在源文件中,当源文件或头文件通过#include指令包含另一个头文件的时候,编译预处理器用头文件的内容取代#include伪指令。这就是说,头文件的所有内容最终都会被合并到某一个或某几个源文件中,如此将每一个包含的头文件递归地展开后形成的源文件就叫编译单元。如果象你说的,直接在头文件中定义函数的执行代码,也是可以的,但这会造成编译单元多了一些不必要的代码。
头文件的主要作用如下:
1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户
提供头文件和二进制的库即可
2)头文件能加强类型安全检查。如果某个接口被实现或被使用时的方式与头文件中的声明不
一致,编译器就会指出错误
3)头文件可以提高程序的可读性(清晰性)。
头文件是用来被包含的,它可以被多个源文件包含。包含(#include) 相当于把头文件的内容插入到源文件。
函数声明可以有多次,定义只能有一次。
定义只能有一次,而声明的次数不限。任何标识符在使用前至少要有声明,将声明放在头文件中,就可以在需要使用到标识符时随时把头文件包含进来即可。如果把定义放进头文件中,那每包含一次头文件,标识符就定义了一次,这样在多文件的编译连接时很容易出问题的。
包含其实就相当于把被包含文件的内容加入到其中,和用被包含文件中的内容替换掉对应的包含语句没有区别。使用头文件的好处就是免除了重复劳动的麻烦。
反正最终编译器都是把被包含文件的内容合并到一块才编译的。所以这样,LZ觉得运行时的调用跟调用任何一个函数有区别吗。