版權聲明
---------------------------------------------------------------------------------------------------------------------
該文章原創於Qter開源社區(www.qter.org)
作者: 女兒叫老白 (白振勇)
轉載請註明出處!
---------------------------------------------------------------------------------------------------------------------
課程目錄:《C++老鳥日記》目錄
本套課程屬於:《C++跨平臺開發乾貨》系列課程。
----------------------------------------------------------------------------------------------------------------------
(3.5, 3.6)。
變量的作用域存在於離它最近的一對括號{}。C++中,我們可以在作用域的任意位置定義變量,比如在for循環中,但是一定要注意,變量的命名務必有含義,避免採用int i之類的定義。因爲在循環體中我們也可能會用int i。這樣就極有可能同循環體之外的int i產生混淆,導致代碼運行時出現我們期望之外的結果。
全局變量是可以在一處定義,然後在其他cpp中也可使用的變量。全局變量定義於函數體之外,且不受作用域的影響,在程序的整個生命週期內都有效。使用extern聲明一個變量是全局變量。
// a.cpp
int g_ConfigCount = 0;
// b.cpp
extern int g_ConfigCount;
如果我們在函數體之外定義一個變量x,但是又不希望在其他cpp中看到x,那麼就可以用靜態變量:
// c.cpp
static double s_Zero = 0.0001f;
// d.cpp
extern double s_Zero; // error! 編譯錯誤
在函數體內部定義的static變量,表示該變量在內存中常駐且只初始化一次,變量生存期不受函數堆棧的影響。既然只初始化一次,那麼在變量定義時就必須初始化。
// e.cpp
int parseFile(const string& strFileName)
{
static int s_successCount = 0;
……
if (…) {
s_successCount ++;
}
}
但是全局變量或者靜態變量的初始化是跟編譯器相關的,不受編程人員的控制,有時候它的初始化可能出現意想不到的結果。我就碰到過文件作用域內的靜態變量初始化兩次的情況,這是有問題的,會導致程序出現不可預知的結果。因此如果使用 static定義文件作用域的靜態變量,請使用全局鎖進行保護(不能用類的成員鎖),比如:
// f.cpp
CMutex g_mtx; // 全局鎖,不能用類的成員鎖。
CMyClass& CMyClass ::getInstance() {
g_mtx.lock();
static CMyClass obj;
return obj;
g_mtx.unlock();
}
-------------------------------- 總結 --------------------------------------
1. 變量的作用域存在於離它最近的一對括號{}。
2. 變量命名要規範,避免使用i、j、k等名稱。循環體內外避免變量重名。
3. static變量可以用在文件作用域內,僅在某個文件內可見。
4. 全局變量初始化過程可能不可預測。