C++筆記:聲明和定義
這是容易混淆的兩個概念。
簡單點說,聲明就是告訴編譯器有這個名字,定義就真正的為它分配存儲空間。
在《C++Primer》第四版 2.3.5節中這麼說到:
變量的定義用於為變量分配存儲空間,還可以為變量指定初始值。在一個程序中,變量有且僅有一個定義。聲明用於向程序表明變量的類型和名字。
定義也是聲明:當定義變量時我們聲明瞭它的類型和名字。可以通過使用extern關鍵字聲明變量名而不定義它。不定義變量的聲明包括對象名、對象類型和對象類型前的關鍵字extern。
需要注意的是: 1.定義也是聲明,extern聲明不是定義,即不分配存儲空間。extern告訴編譯器變量在其他地方定義了。 例如:
extern int i; //聲明,不是定義
int i; //聲明,也是定義
2.如果聲明有初始化式,就被當作定義,即使前面加了extern。 例如:
extern double pi=3.1416; //定義
只有當extern聲明位於函數外部時,才可以被初始化。
3.除非有extern關鍵字,否則都是變量的定義。如果有extern關鍵字,也不一定不是定義。
4.幾點好的程序設計風格:
(1)不要把變量定義放入.h文件,這樣容易導致重複定義錯誤。
(2)儘量使用static關鍵字把變量定義限制於該源文件作用域內,除非該變量被設計成全局的。 例外情況是const變量和typedef類型,在《The C++ Programming Language》9.2 節中說到,const和typedef缺省作用域是局部的,因此不需要static來顯式聲明。因此,在.h文件中放置const變量定義不會產生問題,編譯器會給每個引用該.h文件的源文件產生一份該const變量的局部定義,就像該變量是定義於該源文件中一樣。大家也不用太擔心編譯器這麼做會浪費空間,因為編譯器優化過程一般會把有相同值的const變量進行合併。
關於static關鍵字
對於static關鍵字,要多說幾句的是,static一般有兩種意思,當修飾函數定義裡的變量或者類成員變量時,稱作靜態變量;修飾其他變量時,稱作局部變量。為防止混淆,一般不要特意給局部變量加上static關鍵字。除了static關鍵字,namespace也可以使變量定義成為局部的。
所以一般設計頭文件時候不要把變量的定義放進去。但是可以在頭文件中聲明一個變量,在用的時候包含這個頭文件,當修改變量值的時候就直接修改頭文件裡的內容,防止發生錯誤。
總結: 1. 變量在使用前就要被定義或者聲明。 2. 在一個程序中,變量只能定義一次,卻可以聲明多次。 3. 定義分配存儲空間,而聲明不會。
對於函數,聲明和定義就比較簡單了。帶有{ }的就是定義,否則就是聲明。
int main(); //聲明
int main()
{
}
//定義
備註:本文內容有不少來源於網上,作者不詳。
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。