C++ 預編譯標頭檔案

Andy Niu發表於2013-11-22

1、解決什麼問題?

  C++ 編譯器是單獨,分別編譯的,每個cpp檔案,進行預編譯(也就是對#include,define 等進行文字替換),生成編譯單元。編譯單元是一個自包含檔案,C++編譯器對編譯單元進行編譯。考慮,標頭檔案A.h被多個cpp檔案(比如A1.cpp,A2.cpp)包含,每個cpp檔案都要進行單獨編譯,其中的A.h部分就會被多次重複第編譯,影響效率。

2、怎麼解決?

  把A.h以及類似A.h這樣的標頭檔案,包含到stdafx.h中(當然也可以是其他檔案),在stdafx.cpp中包含stdafx.h,設定stdafx.cpp檔案的屬性,預編譯頭設定為 建立。對於原先包含A.h的cpp檔案,刪除#include "A.h",改成包含stdafx.h,同時設定這些cpp檔案(A1.cpp,A2.cpp)的屬性,預編譯頭設定為 使用。這樣的話,下次編譯A1.cpp,A2.cpp的時候,對於A.h標頭檔案中的那部分,就不需要編譯了,節省時間。

3、預編譯標頭檔案原理

  工程對預先編譯的程式碼進行編譯,會生成一個pch檔案(precompiled header),包含了編譯的結果。注意,可以對任何程式碼生成到pch中,但是生成pch是個很耗時的操作,因此,只對那些穩定的程式碼建立預編譯標頭檔案。

4、對於預編譯頭,分為:建立者,使用者,不使用者。

5、注意:現在的編譯器都有Time Stramp 功能,當編譯整個工程的時候,只編譯那些修改的cpp檔案。但是,這並沒有解決上面提到的問題。考慮A1.cpp經常修改,每次修改,都要對包含的A.h標頭檔案部分,進行編譯。

6、Time Stramp:時間戳是指檔案屬性裡的建立,修改,訪問的時間。每次,檔案內容修改,時間戳都會更新為最新的時間,時間戳發生變化,說明檔案被修改了。

補充說明:時間戳往往應用在同步,比如音訊視訊不同步。舉例來說,A,B兩個人約定在一起,7點幹什麼,8點幹什麼,9點幹什麼,如果在7點沒有同步,就算了,儘量保證8點同步。也就是說,同步是動態的過程,當不同步時,一個等待,一個追趕,保證下一個時間點同步。

相關文章