const的用法:(1)定義常量(const資料成員的初始化隻能在類的構造函數的初始化表中進行,且必須初始化)
(2)修飾函數的參數(常指針,常引用)
(3)修飾函數的傳回值(const char * GetString(void);)
(4)修飾函數的定義體(任何不會修改資料成員的函數都應該聲明為const 類型。如果在編寫const 成員函數時,不慎修改了資料成員,或者調用了其它非const 成 員函數,編譯器将指出錯誤,這無疑會提高程式的健壯性)
static的用法:(1)聲明靜态局部變量,讓函數中局部變量的值在函數調用結束後不消失而保留原值
(2)聲明靜态全局變量/函數,隻限于被本檔案使用。在一個.h檔案中聲明了一個static 函數,那麼,在其他兩個或多個.c檔案中包含此.h檔案,就不會出現重複定義的問題。
(3)聲明靜态資料成員/成員函數,訓示變量/函數屬于一個類而不是屬于此類的任何特定對象的變量和函數,static成員隻能在類體外進行初始化
extern的用法:(1)在一個檔案内聲明全局變量,聲明提前引用
(2)在多檔案的程式中聲明全局變量,将變量作用域擴充到本檔案,避免重複定義
volatile的用法:一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器不會去假設這個變量的值。精确地說就是,優化器(編譯器)在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。下面是volatile變量的幾個例子:
(1) 并行裝置的硬體寄存器(如:狀态寄存器)
(2) 一個中斷服務子程式中會通路到的非自動變量(Non-automatic variables)
(3) 多線程應用中被幾個任務共享的變量
static對函數的修飾與對全局變量的修飾相似,隻能被本檔案中的函數調用,而不能被同一程式其它檔案中的函數調用。
檔案a.c
static int i; //隻在a檔案中用
int j; //在工程裡用
static void init() //隻在a檔案中用
{
}
void callme() //在工程中用
{
static int sum;
}
上面的全局i變量和init()函數隻能用在a.c檔案中,全局變量sum的作用域隻在callme裡。變量j和函數callme()的全局限擴充到整個工程檔案。是以可以在下面的b.c中用extern關鍵字調用。extern告訴編譯器這個變量或者函數在其他檔案裡已經被定義了。
檔案b.c
extern int j; //調用a檔案裡的
extern void callme(); //調用a檔案裡的
int main()
{
...
}
extern的另外用法是當C和C++混合程式設計時如果c++調用的是c源檔案定義的函數或者變量,那麼要加extern來告訴編譯器用c方式命名函數:
檔案A.cpp調用a.c裡面的變量i和函數callme()
檔案A.cpp
extern "C" //在c++檔案裡調用c檔案中的變量
{
int j;
void callme();
}
int main()
{
callme();
}