学习单片机过程中对编译原理的学习理解

2019-04-15 19:14发布

学习单片机过程中对编译原理的学习理解

编译原理的理解


1.预处理
这个阶段预处理器将按照预处理命令进行宏展开,其中,头文件例如 Stm32f10x.h 中的内容将会被完全替换到包含这个头文件的源文件。 2.编译
编译器对各个源文件中的代码进行语法分析,并将代码语言翻译成汇编语言,再将汇编语言翻译成机器语言(有些编译过程直接将代码翻译成机器语言),生成多个 相互独立 的目标文件(.o文件),此时这个文件已很接近很执行文件了(二进制文件)。代码中会使用到函数或全局变量,当编译这段代码时,若函数或全局变量已经声明(不考虑是否已经被定义),则在此处产生一个序列号与函数进行唯一对应。
而函数的定义处也会产生一个序列号,与函数使用处对应 3.链接生成可执行文件
在对整个程序进行检查,将函数定义的目标代码(二进制代码)按照序列号插入替换到函数声明的那段代码中,最终生成可执行文件。

几个问题

  • 头文件中的 #ifndef *** #define ***的作用
    因为在预处理阶段,预处理器会把.h文件中的内容原封不动地复制到源文件中,而我们在编码的过程中难免会出现同时包含相同头文件的情况。如果没有上述操作,将会出现
test.h int var1; int var2; void Func1; main.c#include "test.h" `` `` #include "test.h" int main() { } 预处理之后 main.c中将会出现 int var1; int var2; void Func1; int var1; int var2; void Func1; 显然var1,var2,Func1重复声明了。编译过程将会出错。
  • 宏定义和函数声明的位置合适,语法正确,整个编译过程可以不需要.h文件,but why not?
  • 有些IDE支持外部宏定义,即宏定义可以不写在代码文件中,而是写在IDE的设置中,例如keil在魔术棒定义 USE_STDPERIPH_DRIVER,使得在_Stm32f10x.h_ 中配置使用标准库(包含头文件 __Stm32f10x_conf.h)。