什么是预编译头
预编译头(precompiled header)是程序设计时把头文件编译为中间格式, 以节约在开发过程中编译器反复编译该头文件的开销。
——《维基百科》
可见预编译头的意义就是:防止反复编译某一个头文件。
为何会有预编译头
比如有的头文件包含了巨量的源代码(比如windows.h),如果每一个cpp都包含这个头文件,那么就会导致编译过程非常慢,因为不仅大,而且还要被编译多次。于是呢,有了预编译头技术。把几乎所有cpp都会包含的一堆头文件提取出来放到一个地方,比如stdafx.h中,并在编译工程时,最先编译stdafx.cpp,然后就生成了一个中间文件:.pch,所有cpp都可以使用的文件。你可以看看你的工程所在目录的Debug/Release里面,是否有一个.pch的文件?这就是编译之后的预编译头。也许你以前看到.pch文件,不知道这是啥,现在明白了吧?你看看这文件的大小,10M以上~一个字:硕大无比!应该是工程文件中最大的文件了。
预编译文件的特征
但是你想想,如果这些被预编译的文件是经常会被修改的,那么是不是就失去了预编译的意义了?所以这些预编译的文件都必须是稳定的,不经常被修改的。
预编译头的使用
创建工程的时候,vs默认情况下都会创建:stdafx.h和stdafx.cpp。那么就在stdafx.h中添加工程需要的各种头文件,而在stdafx.cpp中,就只要stdafx.h就可以了。当我们编译时,会默认从stdafx.cpp开始编译,生成.pch文件。当编译其他cpp时,会把.pch文件加载到内存中,当然其他的cpp都必须#include"stdafx.h"。其实.pch中,包含了的是到#include"stdafx.h"这一行为止的所有代码编译结果,而我们往往把#include"stdafx.h"放在cpp的第一行。打开cpp的属性,可以看到下面的配置:
可以尝试改改配置,看看编译时间会不会变慢。
PS:stdafx中的AFX代表Application Framework eXtensions。AFX是Microsoft Foundation Classes(MFC)的旧称。