【C++注意事項】2 變數宣告和定義

nomasp發表於2015-05-20

不可能將所有的C++程式放到一個檔案中咯,因此C++就支援了分離式編譯(separate compilation)機制,它允許將程式分為若干個檔案,每個檔案可被獨立編譯。這樣說明了,當你的程式有很多檔案時,修改其中一個檔案後不需要將所有檔案都重新編譯一遍,只需要編譯修改過的就好,然後將它們都連結起來。

C++是如何支援分離式編譯的呢?通過將宣告和定義分離開來。

宣告(declaration)使得名字為程式所知,一個檔案如果想使用別處定義的名字則必須包含該名字的宣告。

定義(definition)負責建立與名字關聯的實體。

一個宣告語句由一個基本資料型別(base type)和緊隨其後的一個宣告符(declarator)列表組成。

定義還需要申請儲存空間,也可能會為變數賦一個初始值。

如果想宣告一個變數而非定義它,就在變數名前新增關鍵字extern關鍵字標記的變數賦一個 初始值,但是這麼做也就抵消了extern的作用。extern語句如果包含初始值就不再是宣告,而變成了定義。

extern int i;  // 宣告i而非定義i
int 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)語言。程式越複雜,靜態型別堅持越有助於發現問題。然後,前提是編譯器必須知道每一個實體物件的型別,這就要求我們在使用某個變數之前必須宣告其型別。



感謝您的訪問,希望對您有所幫助。 歡迎大家關注、收藏以及評論。

我的更多部落格文章:NoMasp部落格導讀


為使本文得到斧正和提問,轉載請註明出處:
http://blog.csdn.net/nomasp


相關文章