1. 程式人生 > >預編譯標頭檔案的作用和使用方法介紹

預編譯標頭檔案的作用和使用方法介紹

預編譯頭的概念:

所謂的預編譯頭就是把一個工程中的那一部分程式碼,預先編譯好放在一個檔案裡(通常是以.pch為副檔名的),這個檔案就稱為預編譯標頭檔案這些預先編譯好的程式碼可以是任何的C/C++程式碼--------甚至是inline的函式,但是必須是穩定的,在工程開發的過程中不會被經常改變。如果這些程式碼被修改,則需要重新編譯生成預編譯標頭檔案。注意生成預編譯標頭檔案是很耗時間的。同時你得注意預編譯標頭檔案通常很大,通常有6-7M大。注意及時清理那些沒有用的預編譯標頭檔案。

也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它只會編譯那些經過修改的檔案,而不會去編譯那些從上次編譯過,到現在沒有被修改過的檔案。那麼為什麼還要預編譯標頭檔案呢?答案在這裡,我們知道編譯器是以檔案為單位編譯的,一個檔案經過修改後,會重新編譯整個檔案,當然在這個檔案裡包含的所有標頭檔案中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯標頭檔案儲存的正是這部分資訊。以避免每次都要重新處理這些標頭檔案。

預編譯頭的作用:

根據上文介紹,預編譯標頭檔案的作用當然就是提高便宜速度了,有了它你沒有必要每次都編譯那些不需要經常改變的程式碼。編譯效能當然就提高了。

預編譯頭的使用:

要使用預編譯頭,我們必須指定一個頭檔案,這個標頭檔案包含我們不會經常改變的程式碼和其他的標頭檔案,然後我們用這個標頭檔案來生成一個預編譯標頭檔案(.pch檔案)想必大家都知道 StdAfx.h這個檔案。很多人都認為這是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

    #include <afxcmn.h>

這些正是使用MFC的必須包含的標頭檔案,當然我們不太可能在我們的工程中修改這些標頭檔案的,所以說他們是穩定的。

那麼我們如何指定它來生成預編譯標頭檔案。我們知道一個頭檔案是不能編譯的。所以我們還需要一個cpp檔案來生成.pch 檔案。這個檔案預設的就是StdAfx.cpp。在這個檔案裡只有一句程式碼就是:#include “Stdafx.h”。原因是理所當然的,我們僅僅是要它能夠編譯而已,也就是說,要的只是它的.cpp的副檔名。

 預編譯頭的使用:

對於Visual C++ 2010,可以按照以下步驟啟用預編譯標頭檔案功能,以新建Win32空專案為例:

1.為專案新增預編譯標頭檔案,一般命名為stdafx.h(其他名稱亦可,只要檔名和專案設定一致即可);

2.為專案新增預編譯標頭檔案對應的實現程式碼檔案,一般為stdafx.cpp;

3.在Solution Explorer中,選中Project檔案,右鍵選擇Properties,開啟屬性設定對話方塊。首先選擇”All Configuration”,然後在Configuration Properties>>C/C++>>Precompiled Headers>>Precomiled Header選項中選中”Use (/Yu)”;

ScreenShot00113

4.在Solution Explorer中,選中stdafx.cpp,右鍵選擇Properties,開啟屬性設定對話方塊。首先選擇”All Configuration”,然後在Configuration Properties>>C/C++>>Precompiled Headers>>Precomiled Header選項中選中”Create (/Yc)”。

ScreenShot00114