预处理编译汇编链接(程序运行过程中的细节)

1.预处理过程

2主要处理那些源代码文件中的以“#”开始的预编译指令。如“#include”、“#define”等,主要处理规则如下:
将所有的“#define”删除,并且展开所有的宏定义。
处理所有条件预编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”
处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。注意,这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件。
删除所有的注释“//”和“/* */”。
添加行号和文件名标识,比如#2“hello.c”2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号。
保留所有的#pragma编译器指令,因为编译器须要使用它们。
经过预编译后的.i文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到.i文件.所以我们无法判定宏定义是否正确或头文件包含时候正确.

2.编译:

编译可以分为词法分析,语法分析,语义分析,中间代码以及目标代码优化后生产的相应的的代码文件.

编译是将高级语言变成汇编代码.编译后的文件是.s文件.

预处理编译汇编链接(程序运行过程中的细节)_第1张图片汇编代码就是将高级语言翻译成计算机应该对应的操作,例如压入esi  eds或者是移动某个值到寄存器里进行操作.

2.1词法分析

首先源代码被输入到扫描器里,经过扫描器之后程序被拆分,变成了很多个记号.例如:array[i]就会被拆成array [  i  ]这四个记号,

你可能感兴趣的:(linux)