一,宣告與定義的區別
宣告是將乙個名稱引入程式。定義提供了乙個實體在程式中的唯一描述,涉及到記憶體空間的分配以及初始值的設定。宣告和定義有時是同時存在的。
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;
3,下列情況下,定義僅僅是定義
1: 在類定義之外,定義並初始化乙個靜態資料成員。如 int a::a = 0;
2: 在類外定義非內聯成員函式。
二,內部鏈結與外部鏈結
在編譯時,編譯器只檢測程式語法和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成目標檔案。而在鏈結程式時,鏈結器會在所有的目標檔案中找尋函式的實現。如果找不到,那到就會報鏈結錯誤碼。鏈結把不同編譯單元產生的符號聯絡起來。有兩種鏈結方式:內部鏈結和外部鏈結。
如果乙個符號名對於它的編譯單元來說是區域性的,並且在鏈結時不可能與其他編譯單元中的同樣的名稱相衝突,那個這個符號就是內部鏈結。內部鏈結意味著對此符號的訪問僅限於當前的編譯單元中,對其他編譯單元都是不可見的。
在乙個多檔案的程式中,如果乙個符號在鏈結時可以和其他編譯單元互動,那麼這個名稱就有外部鏈結。外部鏈結意味著該定義不僅僅侷限在單個編譯單元中。
3,函式與變數具有的連線性
全域性變數、非內聯成員函式、非內聯函式、非靜態自由函式都具有外部鏈結。
使用const、static關鍵字宣告的函式或變數具有內部鏈結。
4,在標頭檔案中可以包含的內容
宣告僅僅是將乙個符號引入到乙個作用域。而定義提供了乙個實體在程式中的唯一描述。在乙個給定的作用域中重複宣告乙個符號是可以的,但是卻不能重複定義,否則將會引起編譯錯誤。
a,將具有外部鏈結的定義放在標頭檔案中幾乎都是程式設計錯誤。因為如果該標頭檔案中被多個原始檔包含,那麼就會存在多個定義,鏈結時就會出錯。
b,在標頭檔案中放置內部鏈結的定義卻是合法的,但不推薦使用的。因為標頭檔案被包含到多個原始檔中時,在每個編譯單元中有自己的實體存在。大量消耗記憶體空間,還會影響機器效能。
C 定義與宣告 區別
c primer 第四版2.3.5節中這麼說到 變數定義 用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有乙個定義。變數宣告 用於向程式表明變數的型別和名字。定義也是宣告 當定義變數時我們宣告了它的型別和名字。extern關鍵字 通過使用extern關鍵字宣告變數名而不定義它。1....
C 中宣告與定義的區別
宣告 一種把乙個名稱引入或者重新引入到某個c 作用域的構造。定義 它也是一種宣告,但該宣告必須給出被宣告實體的細節。對於變數而言,這裡的細節是指 為被宣告實體保留儲存空間。對於class型別和函式定義而言,指的是包含有一隊花括號內容的宣告。對於外部變數而言,指的是前面沒有關鍵字extern或者在宣告...
C 中定義與宣告的區別
c 中的定義與宣告是兩個很容易混淆的概念,而且對於初學者來說,必須要區分兩個概念的不同。乙個變數的定義是用於為變數分配儲存空間。也可以為變數指定初始值。也就是說,定義不一定要有初始值,但是一定要分配儲存空間。而乙個變數的宣告則是說明乙個變數的型別以及名字。定義也是宣告,讀者可以這樣想,如果乙個變數要...