预处理和预编译
预处理:发生在编译前,做些代码文本的替换工作。
- 宏定义:#define宏定义的替换。
- 文件包含:#include指明的源程序文件嵌入到当前源文件的指令位置处。
- 条件编译:根据标识符来判断程序段是否需要编译这段代码。
// 条件编译
#ifdef 标识符程序段1
#else程序段2
#endif
预编译:发生在编译中,先预先编译某个文件并保存起来(预编译头文件),在编译遇到需要这个文件的地方直接拿来用。
预编译头文件
预编译头文件是什么:预编译头文件(Precompiled Header)实际上就是抓取一堆头文件,并把它们转换成为编译器可以使用的格式,从而不必一遍遍重新编译这些头文件。
为什么需要预编译头文件?
使用预编译头文件主要是为了节省编译的时间
平时写小的项目可能不会用到,一般大型项目会用的比较多。
在一个项目中,如果需要大量使用某个头文件的内容,例如string,那么编译的时候每次#include<string>的时候,都需要重新读取整个string头文件并且编译它。读取编译这个过程,预处理器需要复制string文件内容复制并解析,最后标记编译。当需要大量使用的时候,使用预编译头文件就只需要一次编译。
什么头文件适合放进预编译头文件?
- 始终使用不常更改的一大段代码,例如外部依赖的库,那些基本用户不会去修改的代码。预编译文件仅在它或它包含的任何文件发生更改时进行编辑,如果是需要经常修改的代码放入,那么修改后编译就会导致整个预编译头文件都要重新编译。
- 程序包含多个模块,所有这些模块都使用一组标准的包含文件和相同的编译选项,这样的话就不需要重复include很多。
stdafx.h和pch.h
stdafx.h和pch.h都是在Windows平台上使用的预编译头文件,是Microsoft Visual Studio 中自动生成,其它编译器不用,VS专用。
stdafx.h和pch.h本质上是相同的,只是在Visual Studio 2017及更高版本中,stdafx.h改为了pch.h。
如何使用预编译头文件
在stdafx.h和pch.h中添加需要预编译的头文件即可,然后在需要这些头文件的cpp文件夹中添加#include"stdafx.h"或者#include"pch.h"。
在MFC中,stdafx.h和pch.h文件中自动包含了MFC标准头文件(如Windows.h、Afxwin.h等),所以在需要的这些标准头文件的时候可以不用单独引用,而是直接引用stdafx.h或pch.h。