程序运行的过程如下图:
预处理命令:带#
一、预编译(预处理):
预编译过程主要处理那些源代码文件中的以“#”开始的预处理命令。比如#include
1.将所有的“#define”删除,并且展开所有宏定义。
2.处理所有的条件预编译指令.比如“#if”,“#ifdef”,“#elif”
3.处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
4.删除掉所有注释"//"和"/* */".
5.添加行号和文件名标识,比如#2"hello.c" 2,以便编译时编译器产生调试用的行号信息以及用于编译时产生编译错误或警告时能够显示行号。
6.保留所有的#pragma编译器指令,因为编译器要使用它们。
二、编译
编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析、及优化后生产相应的汇编代码文件,这个过程往往是我们所说的整个程序构建的核心部分,也是最复杂的部分之一。也就是查错。主要错误有:语法错误,函数使用错误(只检查函数有没有声明,链接检查函数有没有实现的部分)。
三、汇编
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。汇编器的汇编过程相对于编译器来讲比较简单,他没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就可以了。
四、链接
链接就是一个找符号的过程
常见的链接错误:函数没有实现,函数名字写错,符号重定义。