带你理解微软的预编译头技术
最后更新于:2022-04-01 23:01:26
通过上一篇文章[带你玩转Visual Studio——带你多工程开发](http://blog.csdn.net/luoweifu/article/details/48915347)的讲解,我们能够在一个Solution中创建多个Project,统一管理一个项目的多个Project。本篇文章我们将继续讲解微软的预编译头技术。
# 不陌生的stdafx.h
还记得[带你玩转Visual Studio——带你新建一个工程](http://blog.csdn.net/luoweifu/article/details/48692267)一文中的图2(为方便阅读,已拷贝到下图 1)吗?我们默认勾选了Precompiled header复选框,创建的工程中就自动添加了stdafx.h和stdafx.cpp,**stdafx.h就是预编译头文件**,勾选Precompiled header就表明采用了微软的预编译头技术。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569dd0375d08b.jpg)
图 1:Application Settings
## 打开或关闭预编译方式
右键工程名->Properties->Configuration Properties->C/C++->Precompiled Header,Precompiled Header下拉列表框选择Use(/Yu)表示**打开**(使用)预编译头的方式,选择Not Using Precompiled Headers表示**关闭**预编译头的编译方式。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569dd03b7f1fa.jpg)
图 2:预编译头的设置
参数说明:
Precompiled Header:是否采用预编译头的方式;
Precompiled Header File:预编译头文件的名称,VS中文件名的大小写不敏感,但最好保持大小写相同。
Precompiled Header Output File:生成的.pch文件我名称,关于.pch文件将再在下面**预编译原理**小节中讲述。
如果是要使用预编译头文件的方式,还需要设置stdafx.cpp文件的属性。右键stdafx.cpp->Properties->Configuration Properties->C/C++->Precompiled Header,Precompiled Header下拉列表框中选择Create(Yc).
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569dd03b974b9.jpg)
图 3:设置.cpp的属性
## 注意事项
**每一个源文件的第一行代码必须包含预编译头文件。**如果你的工程选用了预编译头文件的方式,每一个.cpp文件的第一行代码必须包含预编译头文件(#include “stdafx.h”),否则会编译出错。
# 预编译技术的内存原理
在Windows程序开发时,经常要在各个文件中包含windows.h、afx.h等标准头文件,而这些文件非常的大,在编译时就非常的慢,非常耗时。为解决这个问题,已是就有了预编译头文件的技术。
所谓头文件预编译技术,就是把一个工程(Project)中常用的一些头文件(如标准头文件Windows.h、Afxwin.h等,也可以是自己定义的头文件)包含在stdafx.h中,并对stdafx.h预先编译(在所有的.cpp文件编译之前进行编译),得到编译结果.pch文件(默认名称为ProjectName.pch),后期该工程在编译其它.cpp文件时不再编译stdafx.h中的内容(即使include了它),仅仅使用预编译的结果。
其中stdafx.h叫做**预编译头文件**,stdafx名称的英文全称为:Standard Application Framework Extensions,当然你也可以自己定义预编译头文件的名称,手动重命名stdafx.h,同时将上面图2和图3中对应的名称也得改过来。ProjectName.pch叫做**预编译头**。
采用预编译头技术后,可以加快编译速度,节省编译时间。因为只需要预先编译一次就可以在所有的.cpp编译时使用,不用再次编译。这样带来的一个问题就是**每一个.cpp文件的开头都要包含预编译头文件#include “stdafx.h”。**因为预编译头技术是假定预编译头中的内容会在所有.cpp文件中使用,在编译你的 .cpp 的时候,就会将预编译头中已经编译完的部分加载到内存中。
使用预编译头文件需要注意的几个要点:
1\. 你编写的任何.cpp文件都必须首先包含stdafx.h。
2\. 如果你有工程文件里的大多数.cpp文件需要的.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
3\. 由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
# 如何在非MFC工程中使用MFC库
这部分内容之前写过,就不再赘述,直接给出链接:
[非MFC工程中使用MFC库](http://blog.csdn.net/luoweifu/article/details/41527069)
上一篇回顾:
[带你玩转Visual Studio——带你多工程开发](http://blog.csdn.net/luoweifu/article/details/48915347)
下一篇要讲述的内容:
带你玩转Visual Studio——带你跳出Runtime Library大坑
';