轉自:http://blog.csdn.net/xiaoyusmile/article/details/5420252 1. 變數的定義、聲明 變數的聲明有兩種情況: 一種是需要建立存儲空間的。例如:int a。在聲明的時候就已經建立了存儲空間。這種聲明是"定義性聲明(defining declar ...
轉自:http://blog.csdn.net/xiaoyusmile/article/details/5420252
1. 變數的定義、聲明
變數的聲明有兩種情況:
一種是需要建立存儲空間的。例如:int a。在聲明的時候就已經建立了存儲空間。這種聲明是"定義性聲明(defining declaration)",即我們平時所說的“定義”。
另一種是不需要建立存儲空間的,只是告訴編譯器某變數已經在別處定義過了。例如:extern int a。其中,變數a是在別處定義的。這種聲明是"引用性聲明(referncing declaration)",即我們平時所說的“聲明”。
從廣義的角度來講,聲明中包含著定義,但是並非所有的聲明都是定義。即,定義性聲明既是定義又是聲明,而引用性聲明只是聲明。例如:int a。它既是聲明,同時又是定義。然而對於 extern int a 來講,它只是聲明不是定義。
一般的情況下我們常常這樣敘述,把建立空間的聲明稱之為”定義”,而把不需要建立存儲空間的稱之為”聲明”。很明顯這裡指的聲明是範圍比較窄的,也就是說引用性的聲明。
例子:
int a; //定義性聲明,分配存儲空間,初值不確定
int b = 0; //定義性聲明,分配存儲空間,賦初值
extern int c; //引用性聲明,不分配存儲空間,只是告訴編譯器這個變數已經在別處定義過了
2. 函數的定義、聲明
函數的定義和聲明也是一樣,定義需要分配存儲空間;聲明只是告訴編譯器這個函數已經在別處定義過了。
函數的定義和聲明比較好區分。有函數體的即為定義,不帶函數體即為聲明。
例子:
//聲明
double sqrt(double x);
//定義
double sqrt(double x)
{
return x*x;
}
3. 定義與聲明的區別
(1)是否需要分配存儲空間。
(2)在一個作用域中可以重覆聲明,但不能重覆定義。這是由(1)決定的,可以重覆幾次告訴編譯器某個變數、函數已經在別處定義了,但不能重覆多次地讓編譯器為同一個變數、函數分配不同的存儲空間。