c語言 關鍵字之volatile extern詳解

Volatile 

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

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

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

  • 在中斷服務程序中修改的,供其它程序檢測的變量,通常需要定義爲volatile;
  • 在多任務環境下,各任務間共享的標誌,通常也需要定義爲volatile;
  • 存儲器映射的硬件寄存器通常也需要定義爲volatile,因爲每次對它的讀寫都可能有不同意義;

extern

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

(1)extern修飾變量的聲明

  extern關鍵字可以用來修飾變量,表示該變量在別的文件中已有聲明。例如:我們在文件file1.c中聲明瞭變量int var,然後我們又需要再file2.c中使用該變量,則可在文件file2.c中聲明extern int var,就可在文件file2.c中使用該變量了。

  佷顯然使用extern關鍵字修飾的變量都是全局變量,因爲在其它文件中引用局部變量是不會有意義的,也超出了局部變量的作用域。

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

(2)extern修飾函數聲明

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

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

(3)extern用來進行鏈接指定

  extern用來進行鏈接指定一般用於混合編程,如果我們要在C++程序中調用C代碼,則我們就需要使用extern “C”來聲明,這樣連接器就會使用C的規範來鏈接這部分代碼。

(4) extern與static

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

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