通過上一篇文章[帶你玩轉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就表明采用了微軟的預編譯頭技術。?
?
圖 1:Application Settings
## 打開或關閉預編譯方式
右鍵工程名->Properties->Configuration Properties->C/C++->Precompiled Header,Precompiled Header下拉列表框選擇Use(/Yu)表示**打開**(使用)預編譯頭的方式,選擇Not Using Precompiled Headers表示**關閉**預編譯頭的編譯方式。?
?
圖 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).?
?
圖 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大坑