關鍵字static、const、volatile的作用



關鍵字static的作用是什麼?
這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有三個明顯的作用:
1、在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。
2、 在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所有函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3、在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,但是很少的人能懂得第三部分。做爲一個合格的軟件工程師,我們要懂得第三部分的作用,要懂得本地化數據和代碼範圍的好處和重要性。

int testStatic()
{
 int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出爲:

2

2

2

2

2

 

int testStatic()
{
 static  int x=1;
 x++;
 return x;
}
main()
{
 int i;
 for(i=0;i<5;i++)
 printf("%d/n",testStatic());
}

輸出爲:

2

3

4

5

6

const 有什麼用途?

1)可以定義const 常量

2const可以修飾函數的參數、返回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。
  const意味着"只讀"。區別如下代碼的功能非常重要。

 

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

 

  • 前兩個作用是一樣的,a是一個常整型數。
  • 第三個意味着a是一個指向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。
  • 第四個意思是a是一個指向整型數的常指針(也就是,指針指向的整型數是可以修改的,但指針是不可修改的)。
  • 最後一個意味着a是一個指向常整型數的常指針(也就是,指針指向的整型數是不可修改的,同時指針也是不可修改的)。


  (1)關鍵字const的作用是爲給讀你代碼的人傳達非常有用的信息。例如,在函數的形參前添加const關鍵字意味着這個參數在函數體內不會被修改,屬於"輸入參數"。在有多個形參的時候,函數的調用者可以憑藉參數前是否有const關鍵字,清晰的辨別哪些是輸入參數,哪些是可能的輸出參數。

  (2)合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改,這樣可以減少bug的出現。

  const在C++語言中則包含了更豐富的含義,而在C語言中僅意味着:"只能讀的普通變量",可以稱其爲"不能改變的變量"(這個說法似乎很拗口,但卻最準確的表達了C語言中const的本質),在編譯階段需要的常數仍然只能以#define宏定義!故在C語言中如下程序是非法的:

const int SIZE = 10;
char a[SIZE]; /* 非法:編譯階段不能用到變量 */

 

以下是工作中的使用const例子:

const unsigned char *  pbyData;

unsigned char const DayPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 } ;

extern void dp_write_dsp_block ( const word *bp, word len );

const unsigned short  cnstUni2InterMapSparseIdx[];

 

 

volatile問題:

volatile的語法與const是一樣的,但是volatile的意思是“在編譯器認識的範圍外,這個數據可以被改變”。不知何故,環境正在改變數據(可能通過多任務處理),所以,volatile告訴編譯器不要擅自作出有關數據的任何假設——在優化起家這是特別重要的。如果編譯器說:“我已經吧數據讀入寄存器,而且在沒有與寄存器接觸。”在一般情況下,它不需要再讀入這個數據。但是,如果數據是volatile修飾的,編譯器則是不能做出這樣的假定,因爲數據可能被其他進程改變了,編譯器必須重新讀這個數據而不是優化這個代碼。就像建立const對象一樣,程序員也可以建立volatile對象,甚至還建立const volatile對象。這個對象不能被程序員改變,但可通過外面的工具改變。

    volatile對象每次被訪問時必須重新讀取這個變量的值,而不是用保存在寄存器中的備份。下面時volatile變量的幾個例子:

    .並行設備的硬件寄存器(如狀態寄存器);

    .一箇中斷服務子程序中會訪問到的非自動變量(Non-automatic variables);

    .多現成應用中被幾個任務共享的變量。

一個參數可以const同時也是volatile,一個指針也是可以爲volatile的,但是具體編程時要小心,要保證不被意外修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章