用Keil软件看别人的工程的时候,看到工程里有.h文件和.c文件,比较纳闷,因此收集资料解开心中疑惑。
1、首先是用Keil软件来看工程的,所以工程中所看到的.h和.c文件肯定是跟Keil软件(编译器)有关。
1.1、编译器的工作过程:
1.1.1、预处理阶段。主要是处理“#include”、“#define”、"#ifdef...#endif"、"#ifndef...#endif"等语句。
1.1.2、词法与语法分析阶段。(分析c语言的语法)
1.1.3、编译阶段:从main.c文件进入,编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件(.obj文件)。
1.1.4、连接阶段:将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉文件格式信息。(生成.exe文件)。
1.2、备注:
1.2.1、编译器在编译时是以c文件为单位进行的。
1.2.2、连接器是以目标文件为单位,将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件。在PC上的程序开发,一般都有一个main函数,主要是因为编译器的连接器脚本基本是写main函数作为程序的入口。
1.2.3、编译器的工作流程:查找main.c文件 ---> 目标文件 ---> 可执行文件。
1.3、举例:
1 #include<stdio.h>
2 #include"mytest.h"
3 int main(int argc,char **argv)
4 {
5 test = 25;
6 printf("testl = %d\n",test);
7 }
mytest.h头文件内容如下:
1 #ifndef mytest.h
2 #difine mytest.h
3
4 int test;
5
6 #endif // endof mytest.h
现在以这个例子来讲解编译器工作:
1、预处理阶段:编译器以c文件作为一个单元,首先读这个c文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这个两个文件,找到之后,就会将相应头文件中再去处理宏,变量,函数声明,嵌套的头文件包含等检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中的所有的东东全部扫描进这个当前的c文件中,形成一个中间“c文件”。
2、词法与语法检测。
3、编译阶段:在上一步中,相当与将那个头文件中的test变量扫描进了一个中间c文件,所以test变量是这个文件中的一个全局变量。
待续。。。
----------------
Hayder
E:hayder-su@qq.com