變量定義:用于為變量配置設定存儲空間,還可為變量指定初始值。程式中,變量有且僅有一個定義。
變量聲明:用于向程式表明變量的類型和名字。
定義也是聲明,extern聲明不是定義
定義也是聲明:當定義變量時我們聲明了它的類型和名字。 extern聲明不是定義:通過使用extern關鍵字聲明變量名而不定義它。 [注意] 變量在使用前就要被定義或者聲明。 在一個程式中,變量隻能定義一次,卻可以聲明多次。 定義配置設定存儲空間,而聲明不會。
1.extern告訴編譯器變量在其他地方定義了。
例如:
1
2
2.如果聲明有初始化式,就被當作定義,即使前面加了extern。
隻有當extern聲明位于函數外部時,才可以被初始化。
3.函數的聲明和定義差別比較簡單,帶有{ }的就是定義,否則就是聲明。
4.除非有extern關鍵字,否則都是變量的定義。
一般情況下頭檔案中隻放變量的聲明,因為頭檔案要被其他檔案包含(即#include),如果把定義放到頭檔案的話,就不能避免多次定義變量,c++不允許多次定義變量,一個程式中對指定變量的定義隻有一次,聲明可以無數次。
不過有三個例外,一下三中實體的定義也可放到頭檔案中。
這三個實體可以定義在多個源檔案中,隻要在每個源檔案中的定義相同。
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI4MTM0ITMzYTM2AjMwYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
在這個程式中,我們再函數外部定義了一個變量
注extern int a = 10;隻有當extern聲明位于函數外部時,才可以被初始化。
我們後面還會提到這個問題
在這個程式中,
int a;是個定義,但是未初始化,列印他的值式不确定的,是以編譯時會報未初始化的異常。
int b = 10; 是個定義,并且被正确初始化,列印b的值沒有問題。
但是是個聲明,如果要對c進行讀寫操作,而我們并沒有對c進行定義,是以文法檢查沒有問題,但是在連結時,連接配接器會找不到c的位址。
對于d再明顯不過了,前面我們提到過如果聲明有初始化式,就被當作定義,即使前面加了extern。但是隻有當extern聲明位于函數外部時,才可以被初始化。
現在這個定義很明顯被gcc編譯器認為是錯誤的。
轉自:http://blog.csdn.net/gatieme/article/details/50640424