在使用c++進行程式開發的時候,有個常識我們很熟悉,就是把類的定義寫在.**件中,把類的具體實現寫在.cpp檔案中。這毫無疑問是對的。但我們很少去思考為什麼要這樣做,本文結合自己的學習體會,對頭檔案及const物件的定義進行一些說明。
1。為什麼要使用標頭檔案
使用標頭檔案就是為了在希望使用一些共同函式或資料的時候,只需包含這個檔案就能實現,無需多次重複編寫相同的**,提高了效率。
2。什麼東西可以寫在標頭檔案中
在標頭檔案中,我們的程式設計經驗是,函式的宣告,類的定義等等應該寫在標頭檔案裡面。但具體哪些可以寫,哪些不可以,並不十分清楚。
在c++程式中,我們可以知道對於變數或函式的定義是唯一的,如果在同乙個作用域內有重複的定義,就會產生編譯錯誤。而標頭檔案是要被多個檔案包含的,如果在標頭檔案中存放變數或函式的定義,則會導致編譯提示重定義這樣的錯誤,而宣告則是可以多處編寫的,所以,通過程式的基本知識,標頭檔案中應該寫宣告,而不能寫定義。
3。例外的情況
但我們確實在實踐中有定義放在標頭檔案中,而且並不引發編譯錯誤,難道定義可以放在標頭檔案中嗎,c++允許部分重定義嗎?
c++中允許在標頭檔案中定義的有三中情況:
(1)類定義
(2)內聯函式定義(inline函式。在標頭檔案中有函式實現的,預設為內聯函式)
(3)const 物件定義
其實以上三種情況的原因可以理解為是相同的。以const物件作為例子,說明如下:
對於一般的物件 如 int a=9;;
我們知道它的作用域是整個程式的,在1.cpp和2.cpp中包含同乙個定義了int a=9;的標頭檔案,因為int a=9;作用域是整個程式,所以會產生錯誤。那為什麼const int a=9;不會產生錯誤呢。原因就是const int a=9;的預設作用範圍是檔案作用域的。即,儘管在1.cpp和2.cpp中包含同乙個定義了const int a=9;的標頭檔案,但由於const int a=9;是檔案作用域的,包含了標頭檔案的1.cpp和2.cpp儘管都包含了const int a=9;但他們是各自檔案內的const物件,兩者互不相干,就像不同函式中定義了相同的變數名一樣。
所以,通過在標頭檔案中定義const物件,可以實現多個檔案使用相同的常量值,這在實際的程式中很常見。
說到這裡,有一點疑問需要解決:如果想在別的檔案中訪問本檔案中的const物件該怎麼辦,如果都是單是在別的檔案中使用extern const int a = 9;的話,不會起任何作用,因為已經提示const int a = 9;是檔案作用域的。所以應該在需要被其他檔案使用的const物件定義成這樣:extern const int a = 9;而在別的需要使用這個const物件的地方使用:extern const int a;前者是定義,後者是宣告。這樣就可以使用了。
通過對const物件的說明,我們知道由於是檔案作用域的原因,可以把const物件的定義寫在標頭檔案中。對於另外兩種情況,從實踐上來看,我覺得也可以認為他們具有檔案作用域。
比如在同乙個檔案中,編寫兩個完全相同的類的定義,編譯會提示重定義錯誤,但在兩個不同的檔案中,編寫完全相同的類的定義,不會導致編譯錯誤,這說明類的作用域也是檔案作用域,在包含了同乙個標頭檔案的不同檔案中,雖然都包含了同乙個類的定義,但程式理解為是兩個不同的類的定義(儘管結構完全相同),但這在實現上沒有問題。當然,關於inline函式也可以這樣理解,具體原因可能需要檢視編譯器的相關資料。
C 系統標頭檔案說明
c include 設定插入點 include 字元處理 include 定義錯誤碼 include 浮點數處理 include 檔案輸入 輸出 include 引數化輸入 輸出 include 資料流輸入 輸出 include 定義各種資料型別最值常量 include 定義本地化函式 includ...
C 標準庫標頭檔案說明
類別 標頭檔案演算法庫 algorithms algorithm 容器 containers 順序容器 sequence containers 有序關聯容器 ordered associative containers 無序關聯容器 unordered associative containers ...
linux驅動標頭檔案位置和標頭檔案的說明
在不同版本的核心原始碼上,標頭檔案所在的位置是不同的,比如說在 include include 同樣是regs gpio.h,是在比較低的版本 比如2.6.25 上位於arch arm include asm中,而mach regs gpio.h則是位於arch arm mach s3c2410 i...