一。為什麼預編譯頭文件:
預編譯頭的概念:
所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裡(通常是以.pch為擴展名的),這個文件就稱為預編譯頭文件這些預先編譯好的代碼可以是任何的C/C++代碼,甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6-7M大。注意及時清理那些沒有用的預編譯頭文件。
也許你會問:現在的編譯器都有Time stamp的 功能,編譯器在編譯整個工程的時候,它只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過的文件。那麼為什麼還要預編譯頭文件呢?答案在這裡,我們知道編譯器是以文件為單位編譯的,一個文件經過修改後,會重新編譯整個文件,當然在這個文件裡包含的所有頭文件中的東西(.eg Macro, Preprocessor )都要重新處理一遍。VC的預編譯頭文件保存的正是這部分信息。以避免每次都要重新處理這些頭文件。
根據上文介紹,預編譯頭文件的作用當然就是提高編譯速度了,有了它你沒有必要每次都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。
我們來考察一個典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因為AppWizard會為我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們會發現這個頭文件裡包含了以下的頭文件:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#include <afxcmn.h>
這些正是使用MFC的必須包含的頭文件,當然我們不太可能在我們的工程中修改這些頭文件的,所以說他們是穩定的。
二。如何預編譯頭文件:
要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的代碼和其他的頭文件,然後我們用這個頭文件來生成一個預編譯頭文件(.pch文件)想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個“系統級別”的,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。
1.如何在工程中使用預編譯頭文件:最簡單的是在建立工程的時候選擇“使用預編譯頭文件”;如果建立工程時沒選,那麼還可以在project ->Setting->C/C++ ->precompimed header中設置。
2.如何指定預編譯頭文件的頭文件名:默認為StdAfx.h,不過可以通過project ->Setting->C/C++ ->precompimed header中設置成任何名字(實際是通過指令/Yc, /Yu)。然後再把穩定不變的代碼的頭文件包含到該頭文件中即可。
3.需要的實現文件:編譯需要CPP文件,而這個CPP文件自然地就是頭文件名對應的CPP文件了,在這個CPP文件裡只有一句胡:包含要預編譯的文件頭。
4.通過project ->Setting->C/C++ ->precompimed header中設置預編譯文件的名稱(以.pch結尾)(實際上是通過指定/Fp )。
三。如何使用預編譯的頭文件:
1.通過project ->Setting->C/C++ ->precompimed header設置好使用預編譯頭文件(/Yc, /Yu),依賴哪個頭文件,及預編譯好的頭文件名。
2.如果你把pch文件不小心丟了,根據以上的分析,你只要讓編譯器生成一個pch文件就可以了。也就是說把 stdafx.cpp(即指定/Yc的那個cpp文件)重新編譯一遍就可以了。當然你可以傻傻的 Rebuild all。簡單一點就是選擇那個cpp文件,按一下Ctrl + F7就可以了。
3.如果使用了/Yu,就是說使用了預編譯,我們在每個.cpp文件的最開頭,我強調一遍是最開頭,包含你指定產生pch文件的.h文件(默認是stdafx.h)不然就會有問題。如果你沒有包含這個文件,就告訴你Unexpected file end. 如果你不是在最開頭包含的,你自己試以下就知道了,絕對有很驚人的效果。 (原因就在於編譯器編譯的時候不會編譯stdafx.h前面的頭文件)。