C 將檔案間的編譯依存關係降到最低

2021-08-17 10:32:57 字數 1787 閱讀 7452

20180320 c++ 將檔案間的編譯依存關係降到最低

當對c++程式的某個class實現檔案做了些微修改,再重新建置這個檔案,會花費很長時間,,因為c++沒有把「將介面從實現中分離」這事做的很好。class的定義式不只詳細敘述了class介面,還包括十足的實現細節,eg:

class person

這裡的class person無法通過編譯--若編譯器沒有取得其實現**所用到的class string,data和address的定義式。這樣的定義式通常由#include指示符提供,所以person定義檔案的最上方很可能存在這樣的東西:

#include

#incude"date.h"

#include"address.h"

這樣就是在person定義檔案和其含入檔案之間形成了一種編譯依存關係(compilation dependency),若這些標頭檔案中有任何乙個被改變,或這些標頭檔案所依賴的其他標頭檔案有任何改變,那麼每乙個含入person class的檔案就得重新編譯,任何使用person class的檔案也必須重新編譯。

針對person可以這樣做:把person分割為兩個classes,乙個提供介面,另乙個負責實現介面。若負責實現的那個所謂implementation class取名為personimpl,person將定義如下:

#include//標準程式庫元件不該被前置宣告

#include//此乃為了tr1::shared_ptr而含入

class personimpl;//person實現類的前置宣告

class date;//person介面用到的classes的前置宣告

class address;

class person

在這裡,main class(person)只內含乙個指標成員(這裡使用tr1::shared_ptr),指向其實現類(personimpl)。這樣的設計常被稱為pimpl idiom(pimpl是"pointer to implementation"的縮寫)。這種classes內的指標名稱往往就是pimpl,就像上面**那樣。

這樣的設計之下,person的客戶就完全與dates,addresses以及persons的實現細節分離了。

注意:1、若使用object references或object pointers可以完成任務,就不要使用objects。

2、請盡量以class宣告式替換class定義式。

3、為宣告式和定義式提供不同的標頭檔案。

像person這樣使用pimpl idiom的classes,往往被稱為handle classes。但這樣的classes如何真正做事呢,辦法之一是將它們的所有函式轉交給相應的實現類(implementation classes)並由後者完成實際工作。如下面的person兩個成員函式實現:

#include"person.h"//

#include"personimpl.h"

person::person(const std::string& name,const date& birthday,

const address& addr)

:pimpl(new personimpl(name,birthday,addr))

{}std::string person::name() const 

注意:1、支援"編譯依存性最小化"的一般構想是:相依於宣告式,不要相依於定義式。基於此構想的兩個手段是handle classes和inte***ce classes。

2、程式庫標頭檔案應該以「完全且僅有宣告式」(full and declaration-only forms)的形式存在。這種做法不論是否涉及template都適用。

條款31 將檔案間的編譯依存關係降至最低

條款31 將檔案間的編譯依存關係降至最低 minimize compilation dependencies between files.內容 在你們的開發團隊中,一些有經驗的工程師時不時地會教導新手一些基本的程式設計原則,其中 將介面從實現中 分離 可能是他 她 要你必須牢記原則,因為c 並沒有把...

C 檔案依存關係 提高編譯速度

原文 1 什麼叫檔案依存關係 1 include 2 include date.h 3 inblude image.h 4 class peopel 那麼這樣people定義檔案與該三個檔案之間就形成了一種編譯依存關係。如果這些標頭檔案任何乙個檔案被改變,或這些標頭檔案所依賴其他標頭檔案任何改變,那...

c 將檔案之間編譯關係降到最低

類的定義式 類的定義,可以知道類的大小 類的實現 類的宣告 類的宣告,表明,使用此類,編譯不會出錯 c 並沒有把 將介面從實現中分離 做得很好。class的定義式不只詳細敘述了class介面,還包括十足的實現序幕。如 class person public person const string n...