先行編譯標頭檔(一般副檔名為.PCH),是把一個工程中較穩定的代碼預先編譯好放在一個檔案(.PCH)裡.這些預先編譯好的代碼可以是任何的C/C++代碼--甚至可以是inline函數,只它們在整個工程中是較為穩定的,即在工程開發過程中不會經常被修改的代碼.
為什麼需要先行編譯標頭檔?一言以蔽之:提高編譯速度.一般地,編譯器以檔案為單位編譯,如果修改了一工程中的一個檔案則所有檔案都要重新編譯,包括標頭檔裡的所有東西(eg.Macro宏,Preprocessor預先處理),而VC程式中,這些標頭檔中所包括的東西往往是非常大的,編譯之將佔很長的時間.但它們又不常被修改,是較穩定的,為單獨的一個小檔案而重新編譯整個工程的所有檔案導致編譯效率下降,因此引入了.PCH檔案.
如何使用先行編譯標頭檔以提高編譯速度?要使用先行編譯標頭檔,必須指定一個標頭檔(.H),它包含我們不會經常修改的代碼和其他的標頭檔,然後用這個標頭檔(.H)來產生一個先行編譯標頭檔(.PCH)VC預設的標頭檔就是StdAfx.h,因為標頭檔是不能編譯的,所以我們還需要一個.CPP檔案來作橋樑,VC預設的檔案為StdAfx.cpp,這個檔案裡只有一句代碼就是:#include "StdAfx.h".接下來要用它產生.PCH檔案,涉及到幾個重要的先行編譯指令:/Yu,/Yc,/Yx,/Fp.簡單地說,/Yc是用來產生.PCH檔案的編譯開關.在Project->setting->C/C++的Category裡的Precompiled Header,然後在左邊的樹形視圖中選擇用來編譯產生.PCH檔案的.CPP檔案(預設即StdAfx.cpp)你就可以看到/Yc這個開關,它表示這個檔案編譯了以後是否產生.PCH檔案(可能/Yc的c表示create)./Fp指令指定產生的.PCH檔案的名字及路徑(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H檔案的檔案都會有這個/Yu指令.如果選擇自動Automatic...的話則原來為/Yc的地方就換成了/Yx指令.如果選擇自動,則每次編譯時間編譯器會看以前有沒有產生過.PCH檔案,有則不現產生否則就再次編譯產生.PCH檔案.
注意:
A,實際上,由Appzard項目嚮導產生的預設的標頭檔及CPP檔案StdAfx.h和StdAfx.cpp可以是任何名字的.原因很簡單.但如果你要這樣做就要記得修改相應的Project->setting...下的幾個先行編譯指令(/Yc,/Yu,/Yx,/Fp)的參數.
B.在任何一個包括了將要先行編譯的標頭檔而使用了.PCH檔案的工程檔案的開頭,一定必須要是在最開頭,你要包含那個指定產生.PCH檔案的.H檔案(通過.CPP檔案包括,預設為StdAfx.cpp),如果沒包括將產生我最開頭產生的錯誤.如果不是在最開頭包括將產生讓你意想不到的莫名其妙錯誤,如若不信,盍為試之?
C.先行編譯檔案.PCH產生之很耗時間,而且產生之後它也很占磁碟空間,常在5-6M,注意項目完成之後及時清理無用的.PCH檔案以節約磁碟空間.
D.如果丟了或刪了.PCH檔案而以後要再修改工程檔案時,可將指定的/Yc的.CPP檔案(預設為StdAfx.cpp)重新編譯一次即可再次產生.PCH檔案,不用傻傻的按F7或Rebuild All
如果使用的編譯器是VS系列,可以在工程屬性裡面設定PCH,其它編譯器應該也差不多,不過沒有嘗試過..~~