c語言 關鍵字之volatile extern詳解

2021-10-03 09:51:00 字數 1310 閱讀 3074

在c語言中,還有乙個並不經常使用但卻非常有用的關鍵字volatile。那麼使用volatile關鍵字究竟能幹什麼呢?接下來我將就此問題進行討論。

乙個使用volatile關鍵字定義變數,其實就是告訴編譯系統這變數可能會被意想不到地改變。那麼編譯時,編譯器就不會自作主張的去假設這個變數的值,而進行**的優化了。確切的說就是,編譯器在編譯**時,優化器每次遇到這個變數,都會到記憶體中重新讀取,而不會使用儲存在暫存器裡的備份來對**進行優化。

我們已經了解了volatile關鍵字的基本作用。那麼,在什麼情況下使用volatile關鍵字呢?一般說來,在如下的幾種情況通常會使用volatile關鍵字:

在c語言中,修飾符extern用在變數或者函式的宣告前,用來以標識變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或者函式時,在其它檔案中尋找其定義。extern關鍵字的用法有幾種,我們下面對其進行說明。

extern關鍵字可以用來修飾變數,表示該變數在別的檔案中已有宣告。例如:我們在檔案file1.c中宣告了變數int var,然後我們又需要再file2.c中使用該變數,則可在檔案file2.c中宣告extern int var,就可在檔案file2.c中使用該變數了。

佷顯然使用extern關鍵字修飾的變數都是全域性變數,因為在其它檔案中引用區域性變數是不會有意義的,也超出了區域性變數的作用域。

說到作用域,我們需要說明,儘管使用extern關鍵字修飾的變數,其原本都是全域性變數,但如果extern int var宣告處於某一函式體內,那麼其作用域就在函式體內。這其實與一般變數的作用域是相同的。

從本質上來講,使用extern關鍵字函式和變數沒有什麼區別。如果我們在檔案file1.c中定義有函式void fun(int var),而我們在檔案file2.c中想要應用,那麼我們可以在file2.c中宣告extern void fun(int var),而使用則與在file1.c中並無區別。

當然,應用其它檔案中的函式,更常用的方式是引用相應的標頭檔案。那麼使用extern關鍵字與直接引用標頭檔案有什麼不同呢?首先來講,引用標頭檔案是一種預處理,而extern宣告則應該是鏈結層面的實現。其次,對於大批量引用自然是使用標頭檔案比較方便,但如果我們只是使用個別函式,當然還是使用extern更為直接。

extern用來進行鏈結指定一般用於混合程式設計,如果我們要在c++程式中呼叫c**,則我們就需要使用extern 「c」來宣告,這樣聯結器就會使用c的規範來鏈結這部分**。

從某種意義上來說,extern關鍵字與static關鍵字是相反的,extern關鍵字是宣告想要呼叫的外部變數和函式。而static關鍵字正好宣告為自己使用。當然使用static關鍵字宣告乙個變數時,同時也定義了該變數。而extern宣告乙個變數時,僅是宣告,因為該變數早已在其他地方定義。

C語言關鍵字之volatile

volatile 總是與優化有關,編譯器有一種技術叫做資料流分析,分析程式中的變數在 賦值 在 使用 在 失效,分析結果可以用於常量合併,常量傳播等優化,進一步可以消除一些 但有時這些優化不是程式所需要的,這時可以用 volatile 關鍵字禁止做這些優化。int flag 0 int main v...

C語言volatile關鍵字

volatile 是易變的 不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種 楊家有女初長成,養在深閨人未識 的感覺。volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比...

C語言關鍵字volatile

volatile修飾變數表示該變數易受外界影響發生改變,volatile強烈要求編譯器每次對變數進行訪問都要從記憶體中進行 int a 10 b a c b 當編譯器掃到第一行時10賦給了a 自後a變數的值沒有發生改變,a賦給了b,b賦給了c 由於cpu訪問記憶體的速度較慢,編譯器為了提高效率,直接...