总体来说,分为三步,预处理,编译,链接
预处理
在编译之前,编译器会先处理pre-process(预处理语句)。常见的预处理语句#include,#if,#define,#endif
。预处理语句的功能都十分简单。
#include 找到跟在后面的文件,将文件的内容copy进来
#if 和 #endif 简单的判断语句
#define A B 将cpp文件中的B都换成A
编译
.cpp文件的后缀名告诉编译器这是C++文件,用C++的规则编译它。
补充
translate unit:编译器将.cpp文件编译成.obj文件,此时.cpp文件称为translate unit,因为.cpp文件里可能include其他cpp文件,所以translate unit并不一定只有一个.cpp文件
编译器完成预处理后,cpp文件会被编译器编译成机器码文件即.obj文件,.obj文件内是一堆字母数字,.obj文件是无法运行的。
链接
build项目时,所有obj文件会被连接起来,从而形成可运行的.exe文件。而为了obj文件能够链接成功,cpp文件中如果引用了其他cpp文件的方法,需要声明。
如果没有声明,编译时就会出错;如果声明的方法不存在,链接时就会出错
补充
可能出现以下的链接错误
- 方法的声明和定义不一样
- 如果某方法只在自己的cpp文件起作用,static修饰
- 一个项目中可能多个cpp文件调用同样的.h文件,由于include的性质,会造成链接错误,有三种解决方法
- 1.将.h文件中的方法用static修饰;
- 2.将.h文件中的方法用inline修饰,表示只将方法的方法体拿来用;
- 3.头文件中只留方法的声明,将方法的定义放在其中一个使用该头文件的cpp文件中