關於c 的標頭檔案依賴

2021-10-14 04:55:29 字數 1202 閱讀 6636

正在看google c++程式設計規範,裡面對頭檔案依賴是這麼說的:

使用前置宣告(forward declarations)儘量減少.**件中#include的數量。

當乙個標頭檔案被包含的同時也引入了一項新的依賴(dependency),只要該標頭檔案被修改,**就要重新編譯。如果你的標頭檔案包含了其他標頭檔案,這些標頭檔案的任何改變也將導致那些包含了你的標頭檔案的**重新編譯。因此,我們寧可盡量少包含標頭檔案,尤其是那些包含在其他標頭檔案中的。

使用前置宣告可以顯著減少需要包含的標頭檔案數量。舉例說明:標頭檔案中用到類file,但不需要訪問file的宣告,則標頭檔案中只需前置宣告class file;無需#include "file/base/file.h"。

在標頭檔案如何做到使用類foo而無需訪問類的定義?

1) 將資料成員型別宣告為foo *或foo &;

2) 引數、返回值型別為foo的函式只是宣告(但不定義實現);

3) 靜態資料成員的型別可以被宣告為foo,因為靜態資料成員的定義在類定義之外。

另一方面,如果你的類是foo的子類,或者含有型別為foo的非靜態資料成員,則必須為之包含標頭檔案。

有時,使用指標成員(pointer members,如果是scoped_ptr更好)替代物件成員(object members)的確更有意義。然而,這樣的做法會降低**可讀性及執行效率。如果僅僅為了少包含標頭檔案,還是不要這樣替代的好。

當然,.cc檔案無論如何都需要所使用類的定義部分,自然也就會包含若干標頭檔案。

譯者注:能依賴宣告的就不要依賴定義。

class cfoo;

class test

;

於是在vc下做了下測試,先自行建立foo.h,foo.cpp檔案,裡面定義乙個類cfoo,不用管怎麼定義,隨便都行,然後建議main.cpp,在裡面測試:

之前都是直接include foo.h 檔案,這次不引用,而是宣告一下cfoo類。下面看test類的宣告。

1、正確。說明了規範中第2點,函式引數和返回值只是宣告。

2、正確。說明了規範中第3點,靜態資料成員的型別可以被宣告為foo,因為靜態資料成員的定義在類定義之外。

3、4、正確。5錯誤。說明了規範中第1點,非靜態的資料成員必須是指標或引用,否則需要依賴定義,其實也好理解,非靜態表示每個例項都占有記憶體,必然需要知道記憶體的大小,沒有定義怎麼能知道呢?

分類: c, visual c++

關於C 標頭檔案問題

c標頭檔案可以在c program files x86 microsoft visual studio vc98 include中找到,c 標頭檔案可以在 c program files x86 microsoft visual studio 2017 community vc tools msvc...

關於標頭檔案

自定義標頭檔案通常放在使用該標頭檔案的原始檔所在的目錄中,並使用 include myhead.h 來包含。標頭檔案是不編譯的,因為c語言編譯過程之前有個預編譯過程。在這個過程中用標頭檔案中的內容替換原始檔中 include 命令,所以在編譯器看來,沒有標頭檔案,只有原始檔。預編譯過程還包括條件編譯...

C 中關於標頭檔案的問題

根據編譯原理,在編譯的過程中,只是把頭檔案中的內容進行替換,若重複包含,就會使同一段 在該檔案中出現兩次或多次,引起編譯錯誤。介紹兩種常用的方法,其一是 ifndef a為頭檔名,h代表這是乙個標頭檔案的巨集名 ifndef a h define a h endif原理 每次編譯某一段 時要判定前面...