1、對於以下的宣告語句
int a;
假設其位置出如今全部的函式體之外,那麼它就被稱為外部物件a的定義。這個語句說明了a是乙個外部整型變數,同一時候為a分配了儲存空間。由於外部物件a並沒有被明白指定不論什麼初始值,所以它的初始值默覺得0(某些系統中的聯結器對以其它語言編寫的程式並不保證這一點,c編譯器有責任以適當方式通知聯結器,確保未指定初始值的外部變數初始化為0)。
2、又如以下的宣告語句:
int a = 7;
在定義a的同一時候也為a明白指定了初始值。
這個語句不僅為a分配記憶體,並且也說明了在該記憶體中應該儲存的值。
3、以下的宣告語句:
extern int a;
它並非對a的定義。
這個語句仍然說明了a是乙個外部整型變數,可是由於它包含了externkeyword,這就顯式說明了a的儲存空間是在程式的其它地方分配的,從聯結器的角度來看。上述宣告是乙個對外部變數a的引用。而不是對a的定義。
由於這樣的形式的宣告是對乙個外部物件的顯式引用,即使它出如今乙個函式的內部,也仍然具有相同的含義。比如以下的函式srand在外部變數random_seed中儲存了其整型引數n的乙份拷貝:
void srand( int n )
每乙個外部物件都必須在程式某個地方進行定義。因此,假設乙個程式中包含了語句
extern int a;
那麼。這個程式就必須在別的某個地方包含語句
int a;
這兩個語句既能夠是在同乙個原始檔裡,也能夠位於程式的不同原始檔裡。
4、假設乙個程式對乙個外部變數的定義不止一次,又將如何處理?即對於以下的情形:
int a;
這個語句出如今兩個或很多其它的不同原始檔裡,情況會是如何的?或者說。假設語句
int a = 7;
出如今乙個原始檔裡,而語句
int a = 9;
出如今還有乙個原始檔裡,將出現什麼樣的情形?這個問題的答案一般跟系統有關。
不同的系統可能有不同的處理方式。
嚴格的規則是:每乙個外部變數僅僅能夠定義一次。
假設外部變數的多個定義各指定乙個初始值,比如:
int a = 7;
出如今乙個原始檔裡。而
int a = 9;
出如今還有乙個原始檔裡。大多數系統都會拒絕接受該程式。
可是。假設乙個外部變數在多個原始檔張定義卻沒有指定初始值,那麼某些系統會接受這個程式,而另外一些系統則不會接受。
可是為了避免這樣的問題的發生,最好的方法是每乙個外部變數僅僅定義一次。
C語言中的定義與宣告
什麼是定義?什麼是宣告?它們有何區別?舉個例子 12 a inti b externinti 關於extern,後面解釋 哪個是定義?哪個是宣告?或者都是定義或者都是宣告?什麼是定義 所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或...
C語言中定義和宣告的一些差別
定義 所謂的定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。乙個變數或物件在一定的區域內 比如函式內,全域性等 只能被定義一次,如果定義多次,編譯器會提示你重複定義同乙個變數或物件。變數的定義用於為變數分配儲存空間,還可以為變數指...
C語言中宣告與定義的區別
定義和宣告判斷 a int i 定義 b extern int i 宣告 定義 定義就是 編譯器 建立乙個物件,為這個物件分配一塊記憶體並給它取上乙個名字,這個名字就是我們經常所說的變數名或物件名。乙個變數或物件在一定的區 域內 比如函式內,全域性等 只能被定義一次,如果定義多次,編譯器會提示你重複...