mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
3.4 KiB
3.4 KiB
第一章:基本介绍
1.1 回顾 C 语言的编译过程
- C 语言的编译过程,如下所示:
- 过程 ① :编写(编辑)源代码,即:编写 C 语言源程序代码,并以文件的形式存储在磁盘中。
Note
源程序需要以
.c
作为扩展名。
- 过程 ② :编译,即:将 C 语言源程序转换为
目标程序(或目标文件)
。如果程序没有错误,没有任何提示,就会生成一个扩展名为.obj
或.o
的二进制文件。C 语言中的每条可执行语句经过编译之后,最终都会转换为二进制的机器指令。
Note
- ① 其实,
编译阶段
包含了预处理
、编译
和汇编
。- ②
预处理
是编译过程的第一个阶段。在这个阶段,预处理器处理源代码中的指令(例如:#include
、#define
等),主要任务包括:
- 头文件包含:将头文件的内容插入到源文件中。例如:
#include <stdio.h>
会被替换为stdio.h
文件的内容。- 宏展开:替换宏定义。例如:
#define PI 3.14
会将代码中的PI
替换为3.14
。- 条件编译:根据条件指令(如:
#ifdef
、#ifndef
)有选择地编译代码。- 删除代码中的注释,但是不会进行语法检查。
- 预处理完成后,生成一个扩展名为
.i
的中间文件。- ③
编译
是将预处理后的源代码转换为汇编代码的过程。在这个阶段,编译器会检查代码的语法和语义,将其转换为目标机器的汇编语言,生成一个扩展名为.s
的汇编文件。- ④
汇编
是将汇编代码转换为机器代码(也称为目标代码或目标文件)的过程。在这个阶段,汇编器将汇编指令转换为二进制机器指令,生成一个扩展名为.o
或.obj
的目标文件。
- 过程 ③ :链接(连接),即:将编译形成的目标文件
*.obj
或*.o
和库函数以及其他目录文件链接
,形成一个统一的二进制文件*.exe
。
Note
- 为什么需要链接库文件?
- 因为我们的 C 程序会使用 C 程序库中的内容,如:
<stdio.h>
中的printf()
函数,这些函数不是程序员自己写的,而是 C 程序库中提供的,因此需要链接。其实,在链接过程中,还会加入启动代码,这个启动代码(和系统相关,Linux 下主要有 crt0.c、crti.c 等,它们设置堆栈后,再调用 main() 函数)负责初始化程序运行时的环境。
- 过程 ④ :执行,即:有了可执行的
*.exe
文件,我们就可以在控制台上执行运行此*.exe
文件。
Note
如果
修改
了源代码,还需要重新编译
、链接
,并生成新的*.exe
文件,再执行,方能生效。
1.2 和其他编程语言的对比
- 在编译和链接之前,C 语言需要对源文件进行一些文本方面的操作,如:删除代码中的注释,但是不会进行语法检查、头文件包含、宏展开、条件编译等,这个过程叫做预处理,由
预处理程序(预处理器)
完成。 - 较之其他的编程语言,如:Java 、C# 等,C/C++ 语言更依赖预处理器,所以在阅读或开发 C/C++ 程序的过程中,可能会接触到大量的预处理指令,如:
#include
、#define
等。