预处理、编译和汇编这些步骤程序发生的变化
2018-03-31 22:00
357 查看
现在大多数的程序都是在IDE上进行开发的,预处理、编译、汇编和链接这些过程都有编译器已经设定完成,而实际程序在这个过程发生了什么,我们就无从得知了。但是作为程序员,我们有必要去了解在这个过程中我们的程序都发生了哪些变化。
下面就详细描述每一个步骤发生了什么。
参考《程序员的自我修养》
预处理
1.将所有的#define删除,宏定义进行替换。
2.处理所有条件预编译指令,比如#ifndef ,#define,#if,#elif等。
3.删除所有注释,包括单行注释 // 和 多行注释 /**/。
4.添加行号和文件名标识。
5.保留#program 编译器指令。
6.展开头文件
下面验证上述提到的预处理阶段做的事情。
这是我们main.c源文件,在Linux操作系统下,使用gcc可以获取.i文件,即经过预处理得到的文件。
可以看到,此时的main.i文件相对main.c大了许多,这是因为预处理阶段展开了头文件,大量的库函数的声明即路径被写入到main.i文件中,由于main.i的内容过于庞大,在这里就不贴出来了,大家可以自行验证。我们重点关注一下,宏定义是否被替换、注释是否被删除、以及条件编译指令是否被删除。
对照我们上边写出程序,可以看出。宏定义被替换、单行注释和多行注释均被删除、条件编译指令被删除、添加了行号和文件名。其实头文件#include
由main.i 生成的main.s文件,其内容是main.i程序的对应汇编程序。
汇编
汇编器是将汇编代码转换成机器可以识别的二进制代码,每一条汇编语言几乎对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比价简单,它没有复杂的语法,也没有语义
,也不需要做指令的优化,只是需要根据汇编指令和机器指令的对照表一一翻译就可以了,”汇编”这个名词也来源于此。
最终生成main.o二进制文件,其内容是01序列,当然我们是看不懂的。但是机器能够理解。
下面就详细描述每一个步骤发生了什么。
参考《程序员的自我修养》
预处理
1.将所有的#define删除,宏定义进行替换。
2.处理所有条件预编译指令,比如#ifndef ,#define,#if,#elif等。
3.删除所有注释,包括单行注释 // 和 多行注释 /**/。
4.添加行号和文件名标识。
5.保留#program 编译器指令。
6.展开头文件
下面验证上述提到的预处理阶段做的事情。
#include<stdio.h> #define PI 3.14 //宏定义 #if 1 int main() { //单行注释 float a = PI; printf("helloworld\n"); printf("a = %f\n",a); /*这里用来测试多行注释 这里用来测试多行注释 这里用来测试多行注释 */ } #endif
这是我们main.c源文件,在Linux操作系统下,使用gcc可以获取.i文件,即经过预处理得到的文件。
gcc main.c -E -o main.i
可以看到,此时的main.i文件相对main.c大了许多,这是因为预处理阶段展开了头文件,大量的库函数的声明即路径被写入到main.i文件中,由于main.i的内容过于庞大,在这里就不贴出来了,大家可以自行验证。我们重点关注一下,宏定义是否被替换、注释是否被删除、以及条件编译指令是否被删除。
对照我们上边写出程序,可以看出。宏定义被替换、单行注释和多行注释均被删除、条件编译指令被删除、添加了行号和文件名。其实头文件#include
gcc main.i -S -o main.s
由main.i 生成的main.s文件,其内容是main.i程序的对应汇编程序。
汇编
汇编器是将汇编代码转换成机器可以识别的二进制代码,每一条汇编语言几乎对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比价简单,它没有复杂的语法,也没有语义
,也不需要做指令的优化,只是需要根据汇编指令和机器指令的对照表一一翻译就可以了,”汇编”这个名词也来源于此。
gcc main.s -c -o main.o
最终生成main.o二进制文件,其内容是01序列,当然我们是看不懂的。但是机器能够理解。
相关文章推荐
- 程序执行期间发生了哪些事——预处理,编译,汇编,链接
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- Linux程序编译执行原理之一:预处理-编译-汇编-链接过程分析
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- VS2005中使程序的版本在重新编译后不发生变化
- C/C++程序编译流程(预处理->编译->汇编->链接)细讲
- C/C++程序编译流程(预处理->编译->汇编->链接)
- 程序的处理步骤——预处理、编译、链接、运行
- 程序的预处理、编译、汇编和链接
- 预处理,编译,汇编,链接程序的区别
- C/C++程序编译流程解析(预处理->编译->汇编->链接)
- gcc编译程序的四个阶段(预处理-编译-汇编-链接)
- 编译系统四步骤——预处理、编译、汇编、链接
- 关于gcc编译流程四个步骤的具体分析,预处理、编译、汇编、链接
- 预处理编译汇编链接各步骤详解
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- C/C++程序编译流程(预处理->编译->汇编->链接)
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
- 【Linux】使用vim编写一个程序,gcc查看预处理、编译、汇编、链接过程