嵌入式開發中關鍵字const、static、volatile的用法分析
【1】static:
1)限制變數或者函式的作用域
2)設定變數的儲存域
常見的有:
(1)static全域性變數(2)static區域性變數(3)static函式
(1)static全域性變數:1、static全域性變數只初使化一次,防止在其他檔案單元中被引用;2、只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。
(2)static區域性變數:1、static區域性變數只被初始化一次,下一次依據上一次結果值;2、限制了它的使用範圍
(3)static函式:1、static函式與普通函式作用域不同,僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。
2、static函式在記憶體中只有一份,普通函式在每個被呼叫中維持一份拷貝
static的使用場景包括三種:
修飾函式體內的變數
修飾函式體外的變數
修飾函式
第一種情況,static延長了區域性變數的生命週期,static的區域性變數,並不會隨著函式的執行結束而被銷燬,當它所在的函式被第再次執行時,該靜態區域性變數會保留上次執行結束時的值。如:
1 #include <stdio.h>
2
3 void test()
4 {
5 static int j = 1;
6 printf("%d\n", j);
7 j++;
8 }
9 int main()
10 {
11 test();
12 test();
13
14 return 0;
15 }
輸出的結果是: 1
2
對於後面的兩種情況,static是對它修飾的物件進行了作用域限定,static修飾的函式以及函式外的變數,都是隻能在當前的程式碼檔案中被訪問,其它的檔案不能直接訪問。當多個模組中有重名的物件出現時,不妨把它們用static進行修飾。
【2】extern:
extern可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。另外,extern也可用來進行連結指定。
【3】volatile:
定義:一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。
精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。
下面是volatile變數的幾個例子:
1). 並行裝置的硬體暫存器(如:狀態暫存器)
2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
3). 多執行緒應用中被幾個任務共享的變數
【4】const:
(1)可以保護被修飾的東西防止意外的修改,增強程式的健壯性。
(2)編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為一個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高
(3)const定義的常量在程式執行過程中只有一份拷貝
作為一個程式設計師,我們看到關鍵字const時,首先想到的應該是:只讀。因為,它要求其所修飾的物件為常量,不可對其修改和二次賦值操作(不能作為左值出現)。看幾個例子:
const int a;
int const a;//同上面的程式碼行是等價的,都表示一個常整形數。
int *const a;//const具有"左結合"性,即const修飾*,那麼,不難理解,該句表示一個指向整數的常指標,a指向的整數可以修改,但指標a不能修改。
const int *a;//與下面的這一行等價,根據"左結合"性,const修飾的是(*a),也即是一個整數,所以,這兩句表示指標指向一個常整數。
int const *a;
int const *a const;//根據"左結合"性質,第一個const修飾(*),第二個const修飾(a),因此,這句話表示一個指向常整數的常指標。
合理的使用const關鍵字,不僅能夠讓編譯器很好的保護相應的資料,還能夠直觀的向程式碼的閱讀者傳遞有用資訊。另:
extern:
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
const:
http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
static和extern的區別
http://www.chuxue123.com/forum.php?mod=viewthread&tid=548&extra=page%3D1
volatile:
http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html