博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中.h和.c文件解析
阅读量:4935 次
发布时间:2019-06-11

本文共 1193 字,大约阅读时间需要 3 分钟。

     用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
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.h2 #difine  mytest.h3 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

    

 

           

 

 

    

转载于:https://www.cnblogs.com/Hayder/p/4446086.html

你可能感兴趣的文章
怎么自己在Objective-C中创建代理
查看>>
svn检出maven工程到eclipse里面,部署到tomcat的步骤
查看>>
Under Armour Drive 4 Performance Reviews
查看>>
C#操作目录和文件
查看>>
警惕数组的浅拷贝
查看>>
百度地图 导航
查看>>
SQLServer 错误: 15404,无法获取有关 Windows NT 组
查看>>
html5全局属性
查看>>
【转】Android Hook框架Xposed详解
查看>>
Android 有用代码片段总结
查看>>
英语各种时态例句
查看>>
从下往上看--新皮层资料的读后感 第三部分 70年前的逆向推演- 从NN到ANN
查看>>
(转)系统引导管理器GRUB详解
查看>>
[转帖]SAP MM Tolerance
查看>>
数据访问C#入门经典第21章-读写压缩数据
查看>>
IOS-CocoaPods的详细安装与使用
查看>>
读《世界是数字的》有感
查看>>
curl 模拟发起百度地图API post请求
查看>>
分享本人自编的一个跨平台项目:伙食管理小软件
查看>>
利用GIt命令上传项目到GitHub指定仓库
查看>>