c ++
編譯器採用的是分離編譯模式。在乙個專案中,有多個原始檔存在,但是它們總會有一些內容是相同的,如使用相同的使用者自定義型別,使用了相同的全域性變數等。因此,將這些內容抽取出來放到標頭檔案中
,然後在提供給各個原始檔包含,就可以避免這些內容的重複書寫,提高程式設計效率和**安全性。
立標頭檔案的目的主要是:提供全域性變數,全域性函式的宣告或提供公用資料型別的定義
,從而實現分離變異或**復用。
例如,將全域性變數和全域性函式放到標頭檔案中是最常見的,標頭檔案中的全域性變數需要使用extern宣告。在其他cpp檔案中使用#include idef.h即可將標頭檔案的內容完全拷貝到cpp中,
標頭檔案,其實它的內容跟
。cpp
檔案中的內容是一樣的,都是
c ++
的源**。但標頭檔案不用被編譯。
把所有的函式宣告全部放進乙個標頭檔案中
,當某乙個
。cpp
原始檔需要它們時,它們就可以通過乙個巨集命令「
#include」
包含進這個
。cpp
檔案中,從而把它們的內容合併到
。cpp
檔案中去。
idef.h //標頭檔案
extern int a;
int show(int x,int y);
判斷標頭檔案中的內容是否合適的簡單準則
:規範的標頭檔案應該被多個原始檔包含而不引發編譯錯誤
。概括的說,標頭檔案有如下三個作用:
(1)加強型別檢查,提高**得型別安全性。
在c ++
中使用標頭檔案,對自定義型別的安全也是非常重要的。雖然,在語法上,同乙個資料型別(如乙個
類)在不同的原始檔中書寫多次是允許的,程式設計師認為他們是同乙個自定義型別
。但是,由於使用者自定義型別不具有外部連線特性
,編譯器並不關心該型別的多個版本之間是否一致
,這樣會導致邏輯錯誤的發生。
2)減少**的重複書寫,提高編寫和修改程式的效率。
在程式開發的過程中,對某些資料型別或者介面進行修改是難免的
,使用標頭檔案,只需要修改標頭檔案中的內容,就可以保證修改在所有原始檔中生肖
,從而避免了繁瑣易錯的重複修改。
3)提供保密和**重用的手段。
標頭檔案也是
c ++
**蟲蛹即只中不可缺少的一種手段
,在很多場合,源**不便(或不准)向使用者公布,只要向使用者提供標頭檔案和二進位制的庫即可。使用者只需要按照標頭檔案的介面宣告來呼叫庫功能
,而不必關心介面是怎麼實現的,編譯器會從庫中提取相應的**。
總之,為了模組化和結構清晰,c ++實現分離式編譯的方式是使用標頭檔案
,將全域性變數,函式與自定義型別放在標頭檔案中
,不同檔案通過包含所依賴的標頭檔案
,即可實現不同檔案共用同一變數,函式的目的
。
乙個符號(變數,普通函式,物件),在整個程式中可以被宣告多次,但卻要且僅要被定義一次。乙個程式包含多個檔案,在每個檔案裡宣告且只宣告一次乙個符號,但整個程式中只能定義一次。
1.普通變數。
變數的宣告與定義不一樣,
定義變數和宣告變數的區別在於定義會產生記憶體分配的操作
,在沒有宣告變數時直接定義也屬於宣告
。
int a; int b = 1;
都是定義,如果放到標頭檔案中,被別的檔案包含後會再次定義,引發編譯錯誤。
extern int c;
全域性宣告,放在標頭檔案中。
2.函式
函式在標頭檔案中的宣告與在普通檔案中一樣,函式首部加分號即可。
通過「定義只能有一次」的規則,我們很容易可以得出,標頭檔案中應該只放變數和函式的宣告
,而不能放它們的定義。
但是有四個例外:
放在標頭檔案中而不會重複定義的原因是他們的作用域只在他們所在的檔案中
,當引用時,貌似共享同一變數,實際上被包含時,檔案重新定義了乙個一模一樣的變數,但並不會產生錯誤,即
同名不同域
。
1.const
和ststic
物件;
首先解決常量的疑問,常量在標頭檔案中可宣告為extern和普通常量,
如果沒有的extern,則其必須初始化
,
const int a = 1;
extern const int a = 1;
所有包含檔案中定義乙個= 1;
extern const int a;
引用的檔案中定義,且只能被其中某個檔案定義一次。
然後對於靜態,當然不能加extern,其即可在標頭檔案中定義也可只宣告,且差別僅在於有沒有初始值,如果沒有賦值,其將等於0。
static int a;
static int a = 1;
2. 內聯函式可以在標頭檔案中允許多次定義;
3. 類的定義,注意類的成員函式如果要定義在標頭檔案中
,必須定義在類體內(隱式內聯)。雖然內聯函式可以多次定義,但是類不可以,如果
乙類包含甲類,
ç 類要用到乙類和
甲類時只需要且只能包含
乙類的標頭檔案,可通過
#ifndef
,#定義
自動決定。
不能在c ++
的標頭檔案中放置變數的定義,因為變數只能定義一次,
為什麼類的定義可以放在標頭檔案中呢
?在類的定義部分我們又得知
,類定義只是定義了一種型別,也即說明了乙個類,並沒有實際定義類的物件,定義的是類,定義類描述的是新的型別,而描述新型別並不會開闢記憶體空間去儲存這樣一種新類物件
,因此類定義可以存放在標頭檔案中。
4.函式模板和類模板成員函式的定義通常放在標頭檔案中。
5.類的定義中,類的static變數是實現單例模式的重要條件。
的#include盡量寫到cpp檔案裡。兩個檔案在.h檔案裡相互包括,就會產生編譯錯誤,而兩個檔案在.c的檔案互相包括,不會就
有該問題,因此在.h檔案包括就要避免互相包含的問題,而的.cpp檔案就不需要考慮
。當
.h
檔案中要用到其他標頭檔案中的變數時
(一般只會引用其他標頭檔案中的類
),這時可以將其標頭檔案包含進來,但是兩個標頭檔案不可以相互包含,解決方法是在標頭檔案中進行對方類的宣告
,在cpp
中包含對方標頭檔案。
當子系統含有多個標頭檔案且檔案結構清晰時,將某些標頭檔案放在乙個標頭檔案中可以實現**重用,也是**具有較好的閱讀性。為了避免重複引用c++也提供了#ifdef #define及#endif來避免重複包含帶來的錯誤,有的編譯器也支援#program once 來避免重複包含。
stdafx h標頭檔案解析
windows和mfc的include檔案都非常大,即使有乙個快速的處理程式,編譯程式也要花費相當長的時間來完成工作。為避免這種浪費,在stdafx.h中新增的是mfc用到的標頭檔案和環境引數 比如 include mfc core and standard components include m...
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...