1. 程式人生 > >變量的聲明、定義、初始化(轉)

變量的聲明、定義、初始化(轉)

局部變量 聲明和定義 包含 int 外部變量 存儲 變量聲明 bsp 運行

先分享一下關於變量聲明和定義的區別:

變量的聲明有兩種情況:
(1) 一種是需要建立存儲空間的(定義、聲明)。例如:int a在聲明的時候就已經建立了存儲空間。
(2) 另一種是不需要建立存儲空間的(聲明)。例如:extern int a其中變量a是在別的文件中定義的。
前者是"定義性聲明(defining declaration)"或者稱為"定義(definition)",而後者是"引用性聲明(referncing declaration)"。從廣義的角度來講聲明中包含著定義,但是並非所有的聲明都是定義,例如:int a它既是聲明,同時又是定義。然而對於extern a來講它只是聲明不是定義。一般的情況下我們常常這樣敘述,把建立空間的聲明稱之為"定義",而把不需要建立存儲空間稱之為"聲明"。

很明顯我們在這裏指的聲明是範圍比較窄的,也就是說非定義性質的聲明。

例如:在主函數中
int main()
{
extern int A; //這是個聲明而不是定義,聲明A是一個已經定義了的外部變量
//註意:聲明外部變量時可以把變量類型去掉如:extern A;
dosth(); //執行函數
}

int A; //是定義,定義了A為整型的外部變量(全局變量)


外部變量(全局變量)的"定義"與外部變量的"聲明"是不相同的,外部變量的定義只能有一次,它的位置是在所有函數之外,而同一個文件中的外部變量聲明可以是多次的,它可以在函數之內(哪個函數要用就在那個函數中聲明)也可以在函數之外(在外部變量的定義點之前)。系統會根據外部變量的定義(而不是根據外部變量的聲明)分配存儲空間的。對於外部變量來講,初始化只能是在"定義"中進行,而不是在"聲明"中。所謂的"聲明",其作用,是聲明該變量是一個已在後面定義過的外部變量,僅僅是在為了"提前"引用該變量而作的"聲明"而已。extern只作聲明,不作定義。

用static來聲明一個變量的作用有二:
(1) 對於局部變量用static聲明,則是為該變量分配的空間在整個程序的執行期內都始終存在
(2) 外部變量用static來聲明,則該變量的作用只限於本文件模塊

補充:

但是:extern int x=3;是帶有初始化的聲明,那麽就是一個定義。

在類的定義的裏面不應該有變量的定義:

比如:class A

{int x=3;int y=2;、、、}

其中int x,int y,都是定義,

但是你運行的時候就會報錯,是編譯錯誤,原因是類的數據成員的初始化工作是由構造函數來完成的。

變量的聲明、定義、初始化(轉)