先來個一句話的總結:聲明不分配存儲空間,定義分配存儲空間。
Terminology
聲明——declaration
定義——defination
如何在代碼和參考書中區分這兩種情況,下面詳細舉例說明
聲明(declaration)
extern T v;
聲明是用來告訴程序存在一個類型T的變量v,其中T是一個類型,v是變量名字,但是並不分配存儲空間。用關鍵字extern聲明表明語句是一個聲明。聲明語句若給出變量的初始化值(initializer),其效果會被當作一個定義。
聲明的時候如果包含初始值,則只能放在函數的外部。
定義(defination)
T v;
T v=;
定義用來在程序中分配一段存儲空間,並指出這段空間的類型及名字。一個名字只能有一份對應的存儲空間,因此上在一個程序中同一個變量只能定義一次。定義可以給出初始值,也可以不給出。
在c/c++的程序中,一個程序往往由多個源文件和頭文件構成,在多個源文件中要訪問同一個變量就可以在某一個文件中定義該變量,然後在其他用到該變量的文件中寫上該變量的聲明語句。
下面舉例闡述。
例:
extern int i; // declaration
extern std::string s; // declaration
extern int n = 5; // defination
int i; // defination
int m = 6; // defination
int n = 7; // error. re-defination
行1聲明瞭一個int型變量i;
行2聲明瞭一個std::string型的變量s;
行3儘管存在extern關鍵字,但是因爲給出了初始化值,因此上extern關鍵字被忽略,仍然是定義語句,定義了int變量n,並且給出了初始值5;
行4定義了int型變量i, 但未給出初始化值;
行5定義了int型變量m,並初始化爲6;
行6是定義語句,但是因爲第三行已經定義了n,因此上不能定義第二次,所以該句存在重複定義的錯誤。