编译原理之预处理、编译与链接
先上一张图吧,完美表示出了,一个编辑好的程序变成可运行文件经过的过程(可以把编译和汇编统称为编译)。一、预处理(预编译、编译预处理)主要处理源代码文件中的以“#”开头的预编译指令1.删除所有的#define,展开所有的宏定义。2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3.处理“#include”预编译指令,将文件内容...
先上一张图吧,完美表示出了,一个编辑好的程序变成可运行文件经过的过程(可以把编译和汇编统称为编译)。
一、预处理(预编译、编译预处理)
主要处理源代码文件中的以“#”开头的预编译指令
1.删除所有的#define,展开所有的宏定义。
2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4.删除所有的注释,“//”和“/**/”。
5.保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6.添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。
C语言中源代码文件的文件扩展名为.c,头文件的文件扩展名为.h,经预编译之后,生成xxx.i文件。
在C++,源代码文件的扩展名是.cpp或.cxx,头文件的文件扩展名为.hpp,经预编译之后,生成xxx.ii文件。
二、编译
把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件(语法查错)。
编译期仅仅知道内存分配的位置和大小,不做具体的分配操作
三、汇编
将汇编代码转变成机器可以执行的指令(机器码文件.o文件或者.obj文件)(Windows下为.obj,Linux或Uinux下为.o,没有本质区别,都是二进制文件)
四、链接
链接是指从多个对象文件创建单个可执行文件(将所有的.o及一些动态链接库文件(.exe .dll等)整合到一块)
地址和空间的分配、符号决议(也叫“符号绑定”,倾向于动态链接)和重定位
最终生成可执行的.out文件或者.exe文件
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)