一直很希望清楚的了解C语言是如何从编写代码到编译、链接成可执行文件,最后执行代码的整个过程。今天开始学习《程序员的自我修养》,并从读书的过程中做一些总结与思考,也希望从中可以将晦涩难懂的概念以我自己的理解以简单的语言总结出来。
书中所用到的例子都是以pc为例子,我也试着从mac与ios的角度试着以类比探究他们三者的区别与相同之处。
源代码的编译过程
源代码从文本,经过编译器的处理最终生成可执行文件的过程中一共经历了四个步骤,分别是预处理(prepressing),编译(compliation),汇编(assembly),和链接(linking)。
下图是四个步骤以及对应的生成产物。
步骤1 预编译
预编译是整个编译过程最开始的工作,它的工作是做些代码的替换工作,过程中主要处理文件中以#开始的预编译指令,例如引用其他文件#include 、#define宏替换、#pragma等。
gcc编译器中预编译命令
gcc中使用-E选项进行编译可以输出预编译后的结果,结果输出在后缀为i的文件中。
gcc -E hello.c -o hello.i
主要的规则有以下几个
1. #define ,删除#define并展开所有定义,并做宏文本替换
2.#include,将声明的文件插入到指令的位置,而且插入的过程是递归进行的,也就是说会将所有使用到的文件递归引用
3.处理#if、#ifdef 、#else 、#endif等条件预编译指令
4.保留#pragma编译器命令
5.添加行号和文件名标识,比如 #2 “hello.c” 2
下面举一个简单的例子来说明预编译的输出结果。
例子是一个非常简单的c的名为hello.c的源文件,例子中使用到了上面所说的几种预编译命令,