在网上找到了一篇关于.h 和.c 的文章,复制下来了。以下是正文:
在网上看到一篇关于.H 和.C 的文章,感觉不错,帖出与大家共享.
简单的说
其实要理解 C 文件与头文件有什么不同之处,首先需要弄明白编译器的工作过程,一
般说来编译器会做以下几个过程:
1.预处理阶段;
2.词法与语法分析阶段;
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟 CPU 相关的二进制码,生成各
个目标文件 ;
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关
的可执行文件。
当然,最后还可以用 objcopy 生成纯二进制码,也就是去掉了文件格式信息。编译器
在编译时是以 C 文件为单位进行的,也就是说如果你的项目中一个 C 文件都没有,那么你
的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变
量的重定位,生成最终的可执行文件,在 PC 上的程序开发,一般都有一个 main 函数,这
是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用 main 函数作为程序
入口!!!!
有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标
文件,也就是需要 C 文件,而这些 C 文件中又需要一个 main 函数作为可执行程序的入口,
那么我们就从一个 C 文件入手,假定这个 C 文件内容如下:
#include <stdio.h>
#include "mytest.h"
int main(int argc,char **argv)
{
test = 25;
printf("test.................%d",test);
}
头文件内容如下:
int test;
现在以这个例子来讲解编译器的工作:
1.预处理阶段:编译器以 C 文件作为一个单元,首先读这个 C 文件,发现第一句与第
二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应
头文件中再去处理宏,变量,函数声明,嵌套的头文件包含等。然后检测依赖关系,进行
宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进
这个当前的 C 文件中,形成一个中间“C 文件”。
2.编译阶段,在上一步中相当于将那个头文件中的 test 变量扫描进了一个中间 C 文件,
那么 test 变量就变成了这个文件中的一个全局变量,此时就将所有这个中间 C 文件的所有
变量,函数分配空间,将各个函数编译成二进制码,按照特定目标文件格式生成目标文件
在这种格式的目标文件中进行各个全局变量,函数的符号描述,将这些二进制码按照一定
的标准组织成一个目标文件。
3.连接阶段,将上一步生成的各个目标文件,根据一些参数,连接生成最终的可执行