c中常用的關鍵字static const volatile

來源:互聯網
上載者:User

標籤:http   使用   ar   檔案   sp   on   問題   代碼   c++   

在C語言中,關鍵字static有三個明顯的作用:
1). 在函數體,一個被聲明為靜態變數在這一函數被調用過程中維持其值不變。
2). 在模組內(但在函數體外),一個被聲明為靜態變數可以被模組內所用函數訪問,但不能被模組外其它函數訪問。它是一個本地的全域變數。
3). 在模組內,一個被聲明為靜態函數只可被這一模組內的其它函數調用。那就是,這個函數被限制在聲明它的模組的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他顯然不懂得本地化數
據和代碼範圍的好處和重要性。
我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和一個業餘者打交道。去年Dan Saks已經在他的文章裡完全概括了const的所有用法,因此ESP(譯者:Embedded Systems Programming)的每一位讀者應該非常熟悉const能做什麼和不能做什麼.如果你從沒有讀到那篇文章,只要能說出const意味著“唯讀”就可以了。儘管這個答案不是完全的答案,但我接受它作為一個正確的答案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲明都是什麼意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的)。如果應試者能正確回答這些問題,那麼他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關鍵字 const,也還是能很容易寫出功能正確的程式,那麼我為什麼還要如此看重關鍵字const呢?我也如下的幾下理由:
2). 通過給最佳化器一些附加的資訊,使用關鍵字const也許能產生更緊湊的代碼。
3). 合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。
一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,最佳化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在寄存器裡的備份。下面是volatile變數的幾個例子:
1). 平行裝置的硬體寄存器(如:狀態寄存器)
2). 一個中斷服務子程式中會訪問到的非自動變數(Non-automatic variables)
3). 多線程應用中被幾個任務共用的變數
假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我將稍微深究一下,看一下這傢伙是不是直正懂得volatile完全的重要性。
int square(volatile int *ptr){return *ptr * *ptr;}下面是答案:
1). 是的。一個例子是唯讀狀態寄存器。它是volatile因為它可能被意想不到地改變。它是const因為程式不應該試圖去修改它。
2). 是的。儘管這並不很常見。一個例子是當一個中服務子程式修該一個指向一個buffer的指標時。
3). 這段代碼的有個惡作劇。這段代碼的目的是用來返指標*ptr指向值的平方,但是,由於*ptr指向一個volatile型參數,編譯器將產生類似下面的代碼:
int square(volatile int *ptr){int a,b;a = *ptr;b = *ptr;return a * b;}由於*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:


區別:
對於C/C++語言來講,
const就是唯讀意思,只在聲明中使用;
static一般有2個作用,規定範圍和儲存方式.對於局部變數,static規定其為靜態儲存方式,每次調用的初始值為上一次調用的值,調用結束後儲存空間不釋放;
對於全域變數,如果以檔案劃分範圍的話,此變數只在當前檔案

可見;對於static函數也是在當前模組內函數可見.
static const 應該就是上面兩者的合集.
下面分別說明:
全域:
const,唯讀全域變數,其值不可修改.
static,規定此全域變數只在當前模組(檔案)中可見.
static const,既是唯讀,又是只在當前模組中可見的.
檔案:
檔案指標可當作一個變數來看,與上面所說類似.
函數:
const,返回唯讀變數的函數.
static,規定此函數只在當前模組可見.
類:
const,一般不修飾類,(在VC6.0中試了一下,修飾類沒啥作用)
static,C++中似乎沒有靜態類這個說法,一般還是拿類當特殊的變數來看.C#中有靜態類的詳細說明,且用法與普通類大不相同.

c中常用的關鍵字static const volatile

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.