為變量分配地址和存儲空間的稱為定義,不分配地址的稱為聲明。
變量定義:用於為變量分配存儲空間,還可為變量指定初始值,程序中,變量有且僅有一個定義。
變量聲明:用於向程序表明變量的類型和名字。
定義也是聲明:當定義變量時我們聲明了它的類型和名字。
extern聲明不是定義,因為不分配存儲空間。extern告訴編譯器,變量在其他地方定義了。
//聲明一個外部變量:(通過使用extern關鍵字,可以聲明變量名而不定義它) extern int Number;
//定義一個變量 int Number;
如果聲明有初始化式,就被當作定義,即使前面加了extern。
只有當extern聲明位於函數外部時,才可以被初始化。
//是extern聲明,也是定義,因為對變量進行了初始化 extern double pi=3.1416;
一個變量可以在多個地方聲明,但是只能在一個地方定義。
加入extern修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。
說明:很多時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。
變量的聲明有兩種情況:
1、一種是需要建立存儲空間的。例如:int Number 在聲明的時候就已經建立了存儲空間。
2、一種是不需要建立存儲空間的。 例如:extern int Number 其中變量Number是在別的文件中定義的。
前者是“定義性聲明(defining declaration)”或者稱為“定義(definition)”,而后者是“引用性聲明(referncing declaration)”。
從廣義的角度來講聲明中包含着定義,即定義是聲明的一個特例,所以並非所有的聲明都是定義,例如:int Number 它既是聲明,同時又是定義。然而對於 extern int Number 來講它只是聲明不是定義。
一般的情況下我們常常這樣敘述:建立存儲空間的聲明稱之為“定義”,不需要建立存儲空間的聲明稱之為“聲明”。
很明顯我們在這里指的聲明是范圍比較窄的,即狹義上的聲明,也就是說非定義性質的聲明。
函數的聲明和定義的區別比較簡單,只是看函數之后是否帶有{ }即可;
帶有{ }的就是定義,不帶的就是聲明;
注意事項:
1.變量定義不要放在.h文件中,這會導致重復定義的錯誤;
2.可以在頭文件中聲明一個變量,在用的時候包含這個頭文件就聲明了這個變量;
總結:
1.變量在使用之前要被定義或者聲明;
2.變量只能被定義一次,但是可以被聲明很多次;
3.定義會分配相應的存儲空間,但是聲明不會;
注意:
有三個例外,以下三種實體的定義也可以放到頭文件中:
1.值在編譯時就已知的const變量的定義可以放到頭文件中;
2.類的定義可以放到頭文件中;
3.inline函數;
這三個實體可以定義在多個源文件中,只要在每個源文件中的定義相同;