C語言中的聲明與定義的區別

1、對於下面的聲明語句

int a;
       如果其位置出現在所有的函數體之外,那麼它就被稱爲外部對象a的定義。這個語句說明了a是一個外部整型變量,同時爲a分配了存儲空間。因爲外部對象a並沒有被明確指定任何初始值,所以它的初始值默認爲0(某些系統中的連接器對以其他語言編寫的程序並不保證這一點,C編譯器有責任以適當方式通知連接器,確保未指定初始值的外部變量初始化爲0)。

2、又如下面的聲明語句:

int a = 7;
      在定義a的同時也爲a明確指定了初始值。這個語句不僅爲a分配內存,而且也說明了在該內存中應該存儲的值。

3、下面的聲明語句:

extern int a;
       它並不是對a的定義。這個語句仍然說明了a是一個外部整型變量,但是因爲它包括了extern關鍵字,這就顯式說明了a的存儲空間是在程序的其他地方分配的,從連接器的角度來看,上述聲明是一個對外部變量a的引用,而不是對a的定義。因爲這種形式的聲明是對一個外部對象的顯式引用,即使它出現在一個函數的內部,也仍然具有同樣的含義。例如下面的函數srand在外部變量random_seed中保存了其整型參數n的一份拷貝:

void srand( int n )
{
    extern int random_seed;
    random_seed = n;
}
每個外部對象都必須在程序某個地方進行定義。因此,如果一個程序中包括了語句

extern int a;
那麼,這個程序就必須在別的某個地方包括語句

int a;
這兩個語句既可以是在同一個源文件中,也可以位於程序的不同源文件中。

4、如果一個程序對一個外部變量的定義不止一次,又將如何處理?即對於下面的情形:

int a;
這個語句出現在兩個或更多的不同源文件中,情況會是怎樣的?或者說,如果語句

int a = 7;
出現在一個源文件中,而語句

int a = 9;
出現在另一個源文件中,將出現什麼樣的情形?這個問題的答案一般跟系統有關。不同的系統可能有不同的處理方式。嚴格的規則是:每個外部變量只能夠定義一次。如果外部變量的多個定義各指定一個初始值,例如:

int a = 7;
出現在一個源文件中,而

int a = 9;
出現在另一個源文件中,大多數系統都會拒絕接受該程序。但是,如果一個外部變量在多個源文件張定義卻沒有指定初始值,那麼某些系統會接受這個程序,而另外一些系統則不會接受。但是爲了避免這種問題的發生,最好的方法是每個外部變量只定義一次。











發佈了36 篇原創文章 · 獲贊 15 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章