C++ 程式通常由許多檔案組成。為了讓多個檔案訪問相同的變數,C++ 區分了聲明和定義。
變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在一個程式中,變數有且僅有一個定義。
聲明用於向程式表明變數的類型和名字。定義也是聲明:當定義變數時我們聲明了它的類型和名字。可以通過使用 extern 關鍵字聲明變數名而不定義它。
不定義變數的聲明包括對象名、物件類型和物件類型前的關鍵字 extern:
extern int i; // declares but does not define i
int i; // declares and defines i
extern 聲明不是定義,也不分配儲存空間。事實上,它只是說明變數定義在程式的其他地方。程式中變數可以聲明多次,但只能定義一次。
只有當聲明也是定義時,聲明才可以有初始化式,因為只有定義才分配儲存空間。初始化式必須要有儲存空間來進行初始化。如果聲明有初始化式,那麼它可被當作是定義,即使聲明標記為 extern:
extern double pi = 3.1416; // definition
雖然使用了 extern ,但是這條語句還是定義了 pi,分配並初始化了儲存空間。只有當 extern 聲明位於函數外部時,才可以含有初始化式。
因為已初始化的 extern 聲明被當作是定義,所以該變數任何隨後的定義都是錯誤的:
extern double pi = 3.1416; // definition
double pi; // error: redefinition of pi
同樣,隨後的含有初始化式的 extern 聲明也是錯誤的:
extern double pi = 3.1416; // definition
extern double pi; // ok: declaration not definition
extern double pi = 3.1416; // error: redefinition of pi
聲明和定義之間的區別可能看起來微不足道,但事實上卻是舉足輕重的。
在 C++ 語言中,變數必須且僅能定義一次,而且在使用變數之前必須定義或聲明變數。
任何在多個檔案中使用的變數都需要有與定義分離的聲明。在這種情況下,一個檔案含有變數的定義,使用該變數的其他檔案則包含該變數的聲明(而不是定義)。
總結:
1,變數在使用前就要被定義或者聲明。
2,在一個程式中,變數只能定義一次,卻可以聲明多次。
3,定義分配儲存空間,而聲明不會。