简述C语言中.h文件和.c文件作用和区别

在c语言学习过程中,对.h文件和.c文件不甚了解,参考其他资料后对它进行简要分析:

  • .h文件和.c文件作用
  • 使用.h文件和.c文件的原因

.h文件和.c文件作用

  • xx.h文件 ​​.h中一般放的是同名.c文件中定义的变量、数组、函数的声明,需要让.c外部使用的声明。​
  • xx.c文件 ​​.c文件一般放的是变量、数组、函数的具体定义​

使用.h文件和.c文件的原因

  • 使用.h文件和.c文件的原因主要是为了解决文件编译时重复声明即声明变更繁杂的问题

“在编译器只认识.c(.cpp))文件,而不知道.h是何物的年代,那时的人们写了很多的.c(.cpp)文件,渐渐地,人们发现在很多.c(.cpp)文件中的声明语句就是相同的,但他们却不得不一个字一个字地重复地将这些内容敲入每个.c(.cpp)文件。但更为恐怖的是,当其中一个声明有变更时,就需要检查所有的.c(.cpp)文件。 
于是人们将重复的部分提取出来,放在一个新文件里,然后在需要的.c(.cpp)文件中敲入#include XXXX这样的语句。这样即使某个声明发生了变更,也再不需要到处寻找与修改了。因为这个新文件,经常被放在.c(.cpp)文件的头部,所以就给它起名叫做“头文件”,扩展名是.h。 
在我们语言的初学阶段,往往我们的程序只有一个.c的文件或这很少的几个,这时我们就很少遇到头文件组织这个头疼的问题,随着我们程序的增加,代码 量到了几千行甚至几万行,文件数也越来越多。这时这些文件的组织就成了一个问题,其实说白了这些文件的组织问题从理论上来说是软件工程中的模块设计等等的问题。” —— ​​[ 引自“C 语言项目中.h文件和.c文件的关系” ]​​

要更深入理解这个问题我们需要对编译器原理有一定理解,编译器的作用是将程序代码转换成机器能够直接执行的机器码。主要有以下四个过程:

1.头文件的预编译,预处理

  编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。

  在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。

2.词法和语法分析(查错)

3.编译(汇编代码,.obj文件)

转化为汇编码,这种文件称为目标文件。后缀为.obj。

4.链接(二进制机器码,.exe文件)

  将汇编代码转换为机器码,生成可执行文件。

在编译过程中,.h文件中的所有内容会被写到包含它的.c文件中,而所有的.c文件以一个共同的main函数作为可执行程序的入口。 
在.h文件中编写函数实现依然可以正常编译执行,相当于所有.h的内容最后都被写到了main.c文件中。但是为了逻辑性、易于维护性以及一些其他目的,一般在.h文件中写函数的声明,在.c文件中编写函数的实现。