1. 程式人生 > >C++ 宣告與定義的區別

C++ 宣告與定義的區別

一,宣告與定義的區別

宣告是將一個名稱引入程式。定義提供了一個實體在程式中的唯一描述,涉及到記憶體空間的分配以及初始值的設定。宣告和定義有時是同時存在的。

1,定義也是宣告,extern宣告不是定義,即不分配儲存空間。

int a = 10;    //定義就是宣告
extern int b;  //宣告,不是定義

注意:如果使用extern關鍵字時,對變數進行了初始化,那就是定義。

extern int b = 20;  //是定義

2,下列情況下,宣告僅僅是宣告

1:  僅僅提供函式原型:void display();
2:  extern int a;
3:  class A;
4:  typedef 宣告;
5:  在類中定義的靜態資料成員的宣告

例如:

class A{
public:
    static int a;  //宣告
};

3,下列情況下,定義僅僅是定義

1:  在類定義之外,定義並初始化一個靜態資料成員。如 int A::a = 0;
2:  在類外定義非內聯成員函式。

二,內部連結與外部連結

在編譯時,編譯器只檢測程式語法和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出一個警告,但可以生成目標檔案。而在連結程式時,連結器會在所有的目標檔案中找尋函式的實現。如果找不到,那到就會報連結錯誤碼。連結把不同編譯單元產生的符號聯絡起來。有兩種連結方式:內部連結和外部連結。

1,內部連結:

如果一個符號名對於它的編譯單元來說是區域性的,並且在連結時不可能與其他編譯單元中的同樣的名稱相沖突,那個這個符號就是內部連結。內部連結意味著對此符號的訪問僅限於當前的編譯單元中,對其他編譯單元都是不可見的。

2,外部連結:

在一個多檔案的程式中,如果一個符號在連結時可以和其他編譯單元互動,那麼這個名稱就有外部連結。外部連結意味著該定義不僅僅侷限在單個編譯單元中。

3,函式與變數具有的連線性

全域性變數、非內聯成員函式、非行內函數、非靜態自由函式都具有外部連結。

使用const、static關鍵字宣告的函式或變數具有內部連結。

4,在標頭檔案中可以包含的內容

宣告僅僅是將一個符號引入到一個作用域。而定義提供了一個實體在程式中的唯一描述。在一個給定的作用域中重複宣告一個符號是可以的,但是卻不能重複定義,否則將會引起編譯錯誤。

a, 將具有外部連結的定義放在標頭檔案中幾乎都是程式設計錯誤。因為如果該標頭檔案中被多個原始檔包含,那麼就會存在多個定義,連結時就會出錯。

b, 在標頭檔案中放置內部連結的定義卻是合法的,但不推薦使用的。因為標頭檔案被包含到多個原始檔中時,在每個編譯單元中有自己的實體存在。大量消耗記憶體空間,還會影響機器效能。