c 標頭檔案 再學習

2022-06-20 10:51:09 字數 1374 閱讀 3112

標頭檔案用於宣告而不是用於定義

當設計標頭檔案時,記住定義和宣告的區別很重要的。定義只可以出現一次,而宣告則可以出現多次。下列語句是一些定義,所以不應該放在標頭檔案裡:

1

extern

int ival = 10; //

initializer, so it's a definition

2double fica_rate; //

no extern, so it's a definition

雖然ival宣告為extern,但是它有初始化式,代表這條語句是乙個定義。類似地,fica_rate的宣告雖然沒有初始化式,但也是乙個定義,因為沒有關鍵字extern。同乙個程式中有兩個以上檔案含有上述任乙個定義都會導致多重定義鏈結錯誤。

因為標頭檔案包含在多個原始檔中,所以不應該含有變數或函式的定義。

對於標頭檔案不應該含有定義這一規則,有三個例外。標頭檔案可以定義類、值在編譯時就已知道的const物件和inline函式。

在標頭檔案中定義這些實體,是因為編譯器需要它們的定義(而不是宣告)來產生**。

一些const物件定義在標頭檔案中

回想一下,const變數預設時是定義改變量的檔案的區域性變數。正如我們現在看到的,這樣設定預設情況的原因在於允許const變數定義在標頭檔案中。

在c++中,有些地方需要放置常量表示式。例如,列舉成員的初始化式必須是常量表示式。

一般來說,常量表示式是編譯器在編譯時就能夠計算出結果的表示式。當const整型變數通過常量表示式自我初始化時,這個const整型變數就可能是常量表示式。而const變數要成為常量表示式,初始化必須為編譯器可見。為了能夠讓多個檔案使用相同的常量值,const變數和它的初始化式必須是每個檔案都可見的。而要使初始化式可見,一般都把這樣的const變數定義在標頭檔案中。那樣的話,無論該const變數如何使用,編譯器都能夠看見器初始化式。

但是,c++中的任何變數都只能定義一次。定義會分配儲存空間,而所有對該變數的使用都關聯到同一儲存空間。因為const物件預設為定義它檔案的區域性變數,所以把它們定義放在標頭檔案中是合法的。

這種行為有乙個很重要的含義:當我們在標頭檔案中定義了const變數後,每個包含該標頭檔案的原始檔都有了自己的const變數,其名稱和值都一樣。

當該const變數是用常量表示式初始化時,可以保證所有的變數都有相同的值。但是在實踐中,大部分的編譯器在編譯時都會用相應的常量表示式替換這些const變數的任何使用。所以,在實踐中不會有任何儲存空間用於儲存用常量表示式初始化的const變數。

如果const變數不是用常量表示式初始化,那麼它就不應該在標頭檔案中定義。相反,和其他的變數一樣,該const變數應該在乙個原始檔中定義並初始化。應在標頭檔案中為它新增extern宣告,以使其能被多個檔案共享。

write by fgd

學習筆記 C 標頭檔案

c c程式的標頭檔案以.h為字尾。使用時需要在.cpp檔案中意 include的方式引入。標頭檔案作為一種包含功能函式 資料介面宣告的載體檔案,主要用於儲存程式的宣告,而定義檔案用於儲存程式的實現。函式原型 使用 define或const定義的符號常量 結構宣告 將結構宣告放在標頭檔案中是可以的,因...

C 標頭檔案與C標頭檔案

include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 include 定義本地化函式 include ...

C 標頭檔案與C標頭檔案(math string)

math.h 是c語言中數學函式庫,包含我們常用的一些數學計算上會使用到的函式。c 中有對應相同作用的標頭檔案 cmath 當然c 中兩個標頭檔案都可以使用,c 向c相容。1.include c語言的標頭檔案,包含比如strcpy之類的字串處理函式。注意c語言裡沒有string類的概念,不要弄混。2...