1. 程式人生 > >extern 與 static的用法與區別

extern 與 static的用法與區別

1.extern的用法:
extern可以宣告其他檔案內定義的變數。
在一個程式裡,一個物件只能定義一次,
它可以有多個宣告,但型別必須完全一樣。
如果定義在全域性作用域或者名字空間作用域
裡某一個變數沒有初始化,它會被按照預設方式初始化。
將變數或函式宣告成外部連結,即該變數或函式名在其
它函式中可見。被其修飾的變數(外部變數)是靜態分配
空間的,即程式開始時分配,結束時釋放。
在C++中,還可以指定使用另一語言連結,需要與特定的
轉換符一起使用。
extern “C” 宣告語句
extern “C” { 宣告語句塊 } 
extern 表明該變數在別的地方已經定義過了,在這裡要使
用那個變數.
static 表示靜態的變數,分配記憶體的時候, 儲存在靜態區,
不儲存在棧上面.
static 作用範圍是內部連線的關係,和extern有點相反.
它和物件本身是分開儲存的,extern也是分開儲存的,
但是extern可以被其他的物件用extern 引用,而static 
不可以,只允許物件本身用它


2.static的用法: 
靜態變數作用範圍在一個檔案內,程式開始時分配空間,
結束時釋放空間,預設初始化為0,使用時可以改變其值。 
靜態變數或靜態函式只有本檔案內的程式碼才能訪問它,
它的名字在其它檔案中不可見。 
用法1:函式內部宣告的static變數,可作為物件間的一種
通訊機制 
如果一區域性變數被宣告為static,那麼將只有唯一的一個
靜態分配的物件,它被用於在該函式的所有呼叫中表示這
個變數。這個物件將只在執行執行緒第一次到達它的定義使
初始化。 
用法2:區域性靜態物件 
對於區域性靜態物件,建構函式是在控制執行緒第一次通過該
物件的定義時呼叫。在程式結束時,區域性靜態物件的析構
函式將按照他們被構造的相反順序逐一呼叫,沒有規定確
切時間。 
用法3:靜態成員和靜態成員函式 
如果一個變數是類的一部分,但卻不是該類的各個物件的
一部分,它就被成為是一個static靜態成員。一個static
成員只有唯一的一份副本,而不像常規的非static成員那
樣在每個物件裡各有一份副本。同理,一個需要訪問類成員
,而不需要針對特定物件去呼叫的函式,也被稱為一個static
成員函式。 
類的靜態成員函式只能訪問類的靜態成員(變數或函式)