標籤:聲明 編譯 變數聲明 c++ 機制
不可能將所有的C++程式放到一個檔案中咯,因此C++就支援了分離式編譯(separate compilation)機制,它允許將程式分為若干個檔案,每個檔案可被獨立編譯。這樣說明了,當你的程式有很多檔案時,修改其中一個檔案後不需要將所有檔案都重新編譯一遍,只需要編譯修改過的就好,然後將它們都連結起來。
C++是如何支援分離式編譯的呢?通過將聲明和定義分離開來。
聲明(declaration)使得名字為程式所知,一個檔案如果想使用別處定義的名字則必須包含該名字的聲明。
定義(definition)負責建立與名字關聯的實體。
一個聲明語句由一個基礎資料型別 (Elementary Data Type)(base type)和緊隨其後的一個聲明符(declarator)列表組成。
定義還需要申請儲存空間,也可能會為變數賦一個初始值。
如果想聲明一個變數而非定義它,就在變數名前添加關鍵字extern關鍵字標記的變數賦一個 初始值,但是這麼做也就抵消了extern的作用。extern語句如果包含初始值就不再是聲明,而變成了定義。
extern int i; // 聲明i而非定義iint j; // 聲明並定義j
在函數體內部,如果試圖初始化一個由extern關鍵字標記的變數,將引發錯誤。
// 錯誤int main(){ extern int i; int i=10; return 0;}
變數能且只能被定義一次,但是可以被多次聲明。
// 這樣是可以得extern int i;extern int i;extern int i;int main(){ int i=10; return 0;}
如果要在多個檔案中使用同一個變數,就必須將聲明和定義分離。但是此時變數的定義就必須出現在且只能出現在一個檔案中,而其他用到該變數的檔案必須對其進行聲明,卻絕對不能重複定義。
另外C++還會在編譯階段進行類型檢查(type checking),所以也稱C++是一種靜態類型(statically typed)語言。程式越複雜,靜態類型堅持越有助於發現問題。然後,前提是編譯器必須知道每一個實體物件的類型,這就要求我們在使用某個變數之前必須聲明其類型。
【C++注意事項】2 變數聲明和定義