預編譯頭文件pch

一、         預編譯頭文件c++

做用:提升編譯效率。預編譯頭文件(擴展名爲.PCH),是爲了提升編譯效率而使用的一種方法,把一個工程中較穩定的代碼預先編譯好放在一個文件(.PCH)裏.避免每次編譯時去從新編譯沒有修改的全部文件,這些預先編譯好的代碼能夠是任何的C/C++代碼。函數

爲何須要預編譯頭文件?一言以蔽之:提升編譯速度.通常地,編譯器以文件爲單位編譯,若是修改了工程中的一個文件則全部文件都要從新編譯,包括頭文件裏的全部東西(例如Macro宏,Preprocessor預處理),而VC程序中,這些頭文件中所包括的東西每每是很是大的,編譯之將佔很長的時間.但它們又不常被修改,是較穩定的,爲單獨的一個小文件而從新編譯整個工程的全部文件致使編譯效率降低,所以引入了.PCH文件.ui

要使用預編譯頭文件,必須指定一個頭文件(.H),它包含咱們不會常常修改的代碼和其餘的頭文件,而後用這個頭文件(.H)來生成一個預編譯頭文件(.PCH)。VC默認的頭文件就是StdAfx.h,由於頭文件是不能編譯的,因此咱們還須要一個.CPP文件來做橋樑,VC默認的文件爲StdAfx.cpp,這個文件裏只有一句代碼就是:#include "StdAfx.h".接下來要用它生成.PCH文件。component

默認的預編譯頭文件StdAfx.h及CPP文件StdAfx.cpp能夠是任何名字的.緣由很簡單.但若是你要這樣作就要記得修改相應的Project->setting...下的幾個預編譯指令(/Yc,/Yu,/Yx,/Fp)的參數。htm

舉一個簡單的例子:一個c++工程包含四個文件,pch.h、pch.cpp和Audio.h、Audio.cpp.頭文件pch.h裏面的內容包含不會常常變化的c++代碼和其餘穩定的頭文件。Pch.cpp裏面就一句話#include 「pch.h」 .爲了說明預編譯頭文件能夠是任意的,而不是vc默認的stdafx.h,我這裏使用pch.頭文件做爲預編譯頭文件。因此,將pch.cpp設置爲create產生預編譯頭文件開發

 

將其餘的cpp文件設置爲use使用預編譯頭文件get

 

所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裏(一般是 以.pch爲擴展名的),這個文件就稱爲預編譯頭文件這些預先編譯好的代碼能夠是任何的 C/C++代碼,甚至是inline的函數,可是必須是穩定的,在工程開發的過程當中不會 被常常改變。若是這些代碼被修改,則須要從新編譯生成預編譯頭文件。注意生成預編 譯頭文件是很耗時間的。同時你得注意預編譯頭文件一般很大,一般有6-7M大。注意及 時清理那些沒有用的預編譯頭文件。 也許你會問:如今的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它 只會編譯那些通過修改的文件,而不會去編譯那些從上次編譯過,到如今沒有被修改過 的文件。那麼爲何還要預編譯頭文件呢?答案在這裏,咱們知道編譯器是以文件爲單 位編譯的,一個文件通過修改後,會從新編譯整個文件,固然在這個文件裏包含的全部 頭文件中的東西(.eg Macro, Preprocesser )都要從新處理一遍。VC的預編譯頭文件 保存的正是這部分信息。以免每次都要從新處理這些頭文件。 編譯器

 預編譯頭的使用: 要使用預編譯頭,咱們必須指定一個頭文件,這個頭文件包含咱們不會常常改變的 代碼和其餘的頭文件,而後咱們用這個頭文件來生成一個預編譯頭文件(.pch文件) 想必你們都知道 StdAfx.h這個文件。不少人都認爲這是VC提供的一個「系統級別」的 ,編譯器帶的一個頭文件。其實不是的,這個文件能夠是任何名字的。咱們來考察一個 典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(由於AppWizard 會爲咱們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。咱們 會發現這個頭文件裏包含了如下的頭文件:io

#include // MFC core and standard components編譯

#include // MFC extensions

#include // MFC Automation classes

#include // MFC support for Internet Explorer 4 Common Controls

 這些正是使用MFC的必須包含的頭文件,固然咱們不太可能在咱們的工程中修改這些頭文 件的,因此說他們是穩定的。 那麼咱們如何指定它來生成預編譯頭文件。咱們知道一個頭文件是不能編譯的。因此我 們還須要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件 裏只有一句代碼就是:#include 「Stdafx.h」。緣由是理所固然的,咱們僅僅是要它能 夠編譯而已也就是說,要的只是它的.cpp的擴展名。

 

如下是注意事項:

一、若是使用了/Yu,就是說使用了預編譯,咱們在每一個須要使用預編譯頭文件的.cpp文件的最開頭,我強調一遍是最開頭,包含你指定產生pch文件的.h文件(默認是stdafx.h)否則就會有問題。緣由:編譯器經過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是能夠在project的編譯設置裏指定的。編譯器認爲,全部在指令#include "stdafx.h"前的代碼都是預編譯的,它跳過#include "stdafx. h"指令,使用projectname.pch編譯這條指令以後的全部代碼。(在編譯的時候,在#include "stdafx. h"前面的語句都不予以編譯)

所以,全部的CPP實現文件第一條語句都是:#include "stdafx.h"。

 

二、若是你把pch文件不當心丟了,編譯的時候就會產生不少的不正常的行爲。根據以上 的分析,你只要讓編譯器生成一個pch文件。也就是說把 stdafx.cpp(即指定/Yc的那個 cpp文件)重新編譯一遍。固然你能夠傻傻的 Rebuild All。簡單一點就是選擇那個cpp 文件,從新編譯就便可。否則但是很浪費時間的哦。

三、在其餘的頭文件裏也include 預編譯頭文件。假設你的其餘頭文件也include了預編譯頭文件, 若是別人引用你的這個頭文件又沒有設置成預編譯頭文件, 那引用你頭文件的這我的就煎熬了。緣由:因爲你用到的.h文件裏include了預編譯頭文件,他在他自己的project裏,vs可以判斷的出他是預編譯頭,也能找的到須要的pch,pdb文件。因此對寫這個.h文件的人沒影響。可是你做爲他的客戶,你工做在你的project下,你include了他的h頭文件,而這時vs判斷不出他的頭文件裏include的stdafx是預編譯頭文件,作普通文件編。那可想而知,他的stdafx裏若是有import外面大型的庫(如inventor的tlb,很是慢,咱們犯了這個錯),那編譯速度簡直是煎熬。最要命的是,之後你作任何簡單的修改都要重編,這和預編譯解決的問題剛好相反了。

四、vc默認狀況下使用預編譯頭(/Yu),不明白的在加入新.h文件後編譯時總出現fatal error C1010:在查找預編譯頭指令時遇到意外的文件結尾的錯誤。解決方法是在在include頭文件的地方加上#include "stdafx.h",或者打項目屬性,找到「C/C++」文件夾,單擊預編譯頭屬性頁。修改建立/使用預編譯頭屬性爲不使用預編譯頭

 

 

下面給出一個使用預編譯頭文件的操做步驟, 享受一下預編譯頭文件給咱們帶來的編譯速度的提高:

1)  添加一個stdafx.h文件(名字隨便取, 這裏用了VS默認提供的名稱), 在這個.h文件裏include要使用的頭文件(通常是外部的庫, 本身寫的不常變的頭文件也能夠加進來)

2)  添加一個stdafx.cpp文件, 並include "stdafx.h"

3)  項目屬性-->c/c++-->Precompiled設置爲Use Precompiled Header, stdafx.h

4)  stdafx.cpp屬性-->c/c++->Precompiled設置爲Create Precompiled Header, stdafx.h

5)  done!

 

Windows和MFC的include文件都很是大,即便有一個快速的處理程序,編譯程序也要花費至關長的時間來完成工做。因爲每一個.CPP文件都包含相同的include文件,爲每一個.CPP文件都重複處理這些文件就顯得很傻了。    爲避免這種浪費,AppWizard和VisualC++編譯程序一塊兒進行工做,以下所示:    ◎AppWizard創建了文件stdafx.h,該文件包含了全部當前工程文件須要的MFCinclude文件。且這一文件能夠隨被選擇的選項而變化。    ◎AppWizard而後就創建stdafx.cpp。這個文件一般都是同樣的。    ◎而後AppWizard就創建起工程文件,這樣第一個被編譯的文件就是stdafx.cpp。    ◎當VisualC++編譯stdafx.cpp文件時,它將結果保存在一個名爲stdafx.pch的文件裏。(擴展名pch表示預編譯頭文件。)    ◎當VisualC++編譯隨後的每一個.cpp文件時,它閱讀並使用它剛生成的.pch文件。VisualC++再也不分析Windowsinclude文件,除非你又編緝了stdafx.cpp或stdafx.h。    這個技術很精巧,你不這麼認爲嗎?(還要說一句,Microsoft並不是是首先採用這種技術的公司,Borland纔是。)在這個過程當中你必須遵照如下規則:    ◎你編寫的任何.cpp文件都必須首先包含stdafx.h。 (等待考察)   ◎若是你的工程文件裏的大多數.cpp文件都須要某些.h文件,順便將它們加在stdafx.h文件裏面,而後預編譯stdafx.cpp。    ◎因爲.pch文件具備大量的符號信息,它是你的工程文件裏最大的文件。    若是你的磁盤空間有限,你就但願能將這個你從沒使用過的工程文件中的.pch文件刪除。執行程序時並不須要它們,且隨着工程文件的從新創建,它們也自動地從新創建。

相關文章
相關標籤/搜索