0%
//post-footer

(1.1.7)C++从代码到可执行二进制文件的过程

C++与C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接


首先,预编译:

(1) 将所有的#define删除,并且展开所有宏定义

1
2
3
4
5
6
7
8
#define NUM 17
#define DNUM NUM+NUM
//则表达式 DNUM/2+NUM/2的值为?


//预编译是将DNUM转化成NUM+NUM,所以表达式变成了NUM+NUM/2+NUM/2
//等等!答案不是34,原式=NUM+NUM/2+NUM/2=17+17/2+17/2=17+8+8=33!
//C++里面采用的是floor整型计算,取整,去小数!

(2) 处理所有的条件预编译指令,如#if、#ifdef

1
2
3
4
5
6
7
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H
#include "HEADER_FILE"
#endif

//作用1、防止头文件被多次包含
2、使用#ifndef主要原因是为了避免重复定义,使代码模块化和可维护

(3) 处理#include预编译指令,将被包含的文件插入该预编译指令中,这也是为什么第二点中会发生重复定义

(4) 过滤所有的注释//
(5) 添加行号和文件名标识

其次,编译

(1) 词法分析:将源代码的字符序列分割成一系列的记号
(2) 将预处理后的中间文件转换成汇编语言
(3) 这个步骤将源代码翻译成机器语言。生成对应的目标文件

然后,汇编

这个过程主要将汇编代码转换成机器可以执行的指令

最后,链接

将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
(1) 静态链接: 链接的时候就把调用的函数或者过程链接到了生成的可执行文件的执行;生成的静态链接库
(2) 动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,找要链接的代码

通俗点讲就是:静态链接直接把头文件复制进去,而动态链接是可执行文件包含对库函数的引用,但实际的库文件不被复制,由操作系统动态地加载和链接这些库文件。各有优缺点。

总结 : 预编译先处理#以及注释,编译将文件再转换成汇编语言,第三步汇编是把汇编语言转换成机器可以执行的指令,最后的链接就是选择静态链接还是动态链接

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道