1. 程式人生 > >嵌入式開發中關鍵字const、static、volatile的用法分析

嵌入式開發中關鍵字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