歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言中的聲明與定義的區別

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

日期:2017/3/1 9:40:06   编辑:Linux編程

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;

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

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved