靜態持續變數
C++為靜態儲存持續性提供了3種連結性:外部連結(可在其他檔案中訪問)、內部連結(只能在當前檔案中訪問)和無連結(只能在當前函式或程式碼塊中訪問)。
編譯器將分配固定的記憶體塊來儲存所有的靜態變數,這些靜態變數在整個程式執行期間一直存在。如果沒有顯式的初始化靜態變數,編譯器將把它設定為0,在預設情況下,靜態陣列和結構將每個元素或成員的所有位置都設定為0。
(1)外部連結:必須在程式碼塊的外部宣告它;
(2)內部連結:必須在程式碼塊的外部宣告它,並使用static限定符;
(3)無連結:必須在程式碼內宣告它,並使用static限定符。
如下面例子:
...
int global = 1000; // static duration, external linkage
static int one_file = 50; // static duration, internal linkage
int main()
{
...
}
void funct1(int n)
{
static int count = 0; // static duration, no linkage
int llama = 0;
...
}
void funt2()
{
...
}
說明:
(1)靜態變數 global、one_file、count在整個程式執行期間都存在;
(2)count:作用域為區域性,沒有連結性。意味著只能在funct1()函式中使用,就像llama一樣。與llama不同的是,即使在funct1()函式沒有執行時,count也留在記憶體中。
(3)global:作用域為整個檔案,即在從宣告位置到檔案結尾的範圍內都可以被使用。連結性為外部,因此可以在程式的其他檔案中使用他。
(4)one_file:作用域為整個檔案,即在從宣告位置到檔案結尾的範圍內都可以被使用。連結性為內部,因此只能在包含上述程式碼的檔案中使用它。
下面對三種連結性的使用進行說明:
(1)靜態持續性、外部連結性
如果要在多個檔案中使用外部變數,只需在一個檔案中包含該變數的定義(單定義規則),但在使用該變數的其他檔案中,都必須使用關鍵字extern宣告他:
定義(定義宣告):他給變數分配儲存空間;
double up;
extern int blem = 10;
宣告(引用宣告):他不給變數分配儲存空間,因為他引用已有的變數;宣告使用關鍵字extern,且不進行初始化,否則宣告為定義導致分配儲存空間。
extern int blem;
(2)靜態持續性、內部連結性
可使用外部變數在多檔案程式的不同檔案之間共享資料;可使用連結性為內部的靜態變數在同一個檔案中的多個函式之間共享資料。另外,如果將作用域為整個檔案的變數宣告為靜態的,就不必擔心其名稱與其他檔案中的作用域為整個檔案的變數發生衝突。
(3)靜態持續性、無連結性
在程式碼塊中使用static時,將導致區域性變數的儲存持續性為靜態的。這意味著雖然該變數只在改程式碼塊中可用,但他在改程式碼塊不處於活動狀態時仍然存在。因此在兩次函式呼叫之間,靜態區域性變數的值將保持不變。另外,如果初始化了靜態區域性變數,則程式只在啟動時進行一次初始化,以後再呼叫函式時,將不會像自動變數那樣被再次初始化。
相關文章
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 靜態變數和非靜態變數變數
- 靜態變數與靜態方法變數
- 靜態變數和Session變數Session
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 區域性變數和全域性變數(靜態和非靜態)區別變數
- static靜態變數的理解變數
- js中的靜態變數JS變數
- 靜態全域性變數和全域性變數變數
- 靜態變數和例項變數區別?變數
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- 全域性變數和靜態變數的區別變數
- 函式的靜態變數 static函式變數
- Java靜態變數塊使用案例Java變數
- C/C++ 靜態變數解析C++變數
- PHP的靜態變數介紹PHP變數
- VBA靜態變數與常量(轉)變數
- C#靜態建構函式及靜態變數學習C#函式變數
- Java自學入門之靜態變數Java變數
- 遞迴程式中的靜態變數遞迴變數
- asp.net中使用靜態變數ASP.NET變數
- Java逆向基礎之靜態變數存取Java變數
- Spring如何為靜態變數注入值Spring變數
- C語言--靜態區域性變數C語言變數
- C++ static variable(靜態變數) 學習C++變數
- java優化程式設計-靜態變數Java優化程式設計變數
- java靜態變數和靜態函式是否可以被繼承,重寫!Java變數函式繼承
- 避免因在類中使用靜態函式而大量使用靜態變數 (轉)函式變數
- 繫結變數在靜態sql和動態sql中變數SQL
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 關於例項變數和靜態變數的一點疑問變數
- 獨一無二----靜態成員變數 (轉)變數
- 持續整合、持續部署、持續交付、持續釋出
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 動態引數,靜態引數
- 持續整合、持續交付、持續部署簡介
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為宿主變數SQL變數
- 持續整合持續部署持續交付_持續整合與持續部署之間的真正區別