C 標頭檔案的包含與編譯優化

2021-06-19 11:22:40 字數 876 閱讀 2492

寫c++程式時,不要標頭檔案中包含太多其他的標頭檔案,除非絕對必要。

通常我們在標頭檔案中宣告類,在cpp檔案中實現該類的函式。

如果成員函式的引數是別的類的宣告或引用,則可能會直接包含該類的宣告對應的標頭檔案。

舉個例子:我定義兩個類:a(分別對應的檔案a.h,a.cpp)和b(分別對應的檔案b.h,b.cpp),,

像這種情況下,假如a類a.h中有個成員函式宣告:void fun(  b  *pointer );

該函式的實現在a.cpp中。通常情況下,為了省事,可能會直接在a.h中包含b.h。這樣做有什麼不好呢?

假如說b類的標頭檔案有些改動,如增加函式等,在編譯時就會重新編譯b類,當然a類也必須要重新編譯。

可是,這樣就導致了a.h檔案的內容發生了改變,那些在同一專案中其他的包含了a.h的檔案也需要重新編譯,試想如果所有的標頭檔案被包含在標頭檔案中(有點繞,呵呵),這樣導致的重新編譯的檔案時是相當多的。如果專案中檔案少,那倒無所謂,如果動輒上千,上萬個原始檔,將會大大增加編譯時間。

哪應該怎麼做呢?在標頭檔案中,若只是成員函式引數只是放著別的類的指標或引用,則可在標頭檔案的上方,宣告該類即可。

還以上面為例子:

首先,在a.h中宣告b 類:   class b;

然後,在a.cpp中放置b類的標頭檔案。

你會問,還不是要加b類的標頭檔案呀?這樣又有什麼好處?

這好處當然有:a類要想編譯通過,自然要包含b類的標頭檔案,這樣,當b類的標頭檔案改變時,只會影響a類(的cpp檔案),可是不會影響a類的標頭檔案,自然不會影響包含了a類標頭檔案的其他原始檔了,你需要重新編譯的原始檔自然就少了,在編譯上所花費的時間就少了。

順便說一句,有時候你發現,有的.cpp原始檔明明沒有包含某個類的宣告,使用了該類的函式,然而編譯卻通過了,這是否在你的意料之中呢?

C 標頭檔案包含

c 編譯是一件非常費時的事情,為了盡量的減少編譯時間,必須更好的包含標頭檔案。下面有幾條很重要的教條,可以參考。1 在標頭檔案中能用類前置宣告代替標頭檔案包含的就用前置宣告。因為使用類前置宣告,當引用的類發生改變時,當前檔案不需要重新編譯。a 必須要包含標頭檔案的情況 a繼承c,a類的標頭檔案中必須...

C 標頭檔案包含順序

使用標準的標頭檔案包含順序可增強可讀性,避免隱藏依賴。h c 系統檔案 c 系統檔案 其他庫的 h 檔案 本專案內 h 檔案 h 本專案內 h 檔案 其他庫的 h 檔案 c 系統檔案 c 系統檔案 為了減少隱藏依賴,同時標頭檔案和其實現檔案匹配,應該先包含其首選項 即其對應的標頭檔案 google風...

C 標頭檔案的包含順序

一 google c 程式設計風格指南 裡的觀點 dir2 foo2.h preferred location see details below c system files.c system files.other libraries h files.your project s h files...