学习单片机过程中对编译原理的学习理解
程序员文章站
2024-03-25 09:48:34
...
编译原理的理解
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)。
上一篇: 视觉SLAM十四讲学习笔记——第十讲 后端优化(2)
下一篇: opencv计算机视觉学习笔记一