C语言中.h和.c文件解析

     用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

    

 

           

 

 

    

posted @ 2015-04-22 01:02  Hayder  阅读(5160)  评论(0编辑  收藏  举报