目录
- 在前面讲到了宏的定义,那么宏在编译时候是如何发生替换的?接下来做一下详细的介
- 绍C语言程序的编译过程主要包括以下几个步骤:预处理、编译、汇编和链接。
一、预处理(预编译)
预处理阶段:预处理器会处理源代码中的预处理指令,如宏定义、头文件包含、条件编译等,生成一个经过预处理后的文件。
- 宏展开(Macro Expansion):预处理器首先查找并替换所有的宏定义,包括对象宏、函数宏以及带参数的宏。
- 文件包含(File Inclusion):#include指令指示预处理器读取并插入指定文件的内容到当前源文件中。
- 条件编译(Conditional Compilation):通过#if、#ifdef、#elif、#else、#endif等指令实现条件编译,根据预定义标识符或用户自定义的宏来决定哪些代码段参与最终的编译。
- 注释删除(Comment Removal):预处理器会移除所有源代码中的注释,确保注释内容不会影响编译结果。
- 行号和文件名标识(Line and File Name Marking):添加行号和文件名标识,方便后续编译器生成调试信息。
- 处理预定义符号:C语言预设了一些预定义符号,这些预定义符号也是在预处理期间处理的,如__FILE__、__LINE__、__DATE__、__TIME__等。
若要将预处理后的代码保存到文件中,可以使用gcc -E yourfile.c -o yourfile.i
,这样会将预处理后的代码保存到yourfile.i文件中。
在 gcc环境下,生成了 ( . i) 为后缀的文件,在预编译期间的执行的操作,如图:
( .c)文件
( . i)文件
二、编译
编译阶段:编译器将预处理后的文件进行词法分析、语法分析、语义分析等操作,生成一个汇编代码文件。
在gcc环境下,gcc -S yourfi指令,生成( .s )文件,此时的C语言代码就生成了汇编代码,如图:
三、汇编
汇编阶段:汇编器将汇编代码翻译成机器代码,生成一个目标文件。
- 生成目标代码:将汇编代码翻译成机器码指令,并将这些指令打包形成可重定向的目标文件,通常是.o文件,它是二进制文件。
- 形成符号表:对应全局函数和库函数的地址将其符号表的形式保存,以便后续的链接阶段可以使用。
- 准备可执行文件:将生成的目标文件与其他目标文件和库文件链接起来,形成最终的可执行文件,如.exe文件。
- 优化代码:在汇编过程中,编译器会对代码进行优化,以提高程序的效率和性能。
- 处理异常和错误:在汇编过程中,编译器会检测并处理可能出现的异常和错误,以确保程序的正确性和稳定性。
- 生成调试信息:为了方便开发者进行调试,编译器会在汇编阶段生成相关的调试信息,如行号、变量名等。
在gcc环境下,gcc -c yourfile.c指令,可生成( .o )为后缀的文件,但是无法发开:
四,链接
链接阶段:是将编译后的目标文件与所需库文件合并,解决符号引用和地址重定位,生成可执行文件的过程。
链接的重要性在于它能够将分散在不同文件中的代码片段整合成一个完整的程序。在链接过程中,程序中的符号引用会被解析到它们在内存中的实际地址,确保程序的正确执行。