extern:函數
extern修飾變量,聲明該變量爲外部文件的全局變量。若使用外部全局變量,必須用extern聲明。優化
extern修飾函數,聲明該函數爲外部函數。extern修飾的函數形參必須與原函數一致,不然可能致使傳參出錯,且編譯器不會報警。建議聲明外部函數省略掉extern。操作系統
const:線程
定義常量,即用const聲明的變量值不能被修改。指針
const char* p, char const* p, char* const p的區別:編譯器
C語言中const不能修飾*,所以const char* p與char const* p等價,均表示定義一個指向字符常量的指針,即*p爲常量,*p不能被修改。編譯
而char* const p表示定義一個指向字符的常量指針,即p爲常量,不能被修改,*p能夠改變。變量
volatile:硬件
volatile修飾的變量表示能夠被某些編譯器未知的因素更改,好比操做系統、硬件或者其餘線程等,遇到volatile聲明的變量,編譯器對訪問該變量的代碼再也不進行優化,從而能夠提供對特殊地址的穩定訪問。語言
例如:int i=1;if(i>0)...else... 編譯器會認爲在if判斷前i賦值爲1,i>0恆成立,所以編譯器會優化掉else的語句以節省空間。
volatile int i=1;if(i>0)...else... volatile告知編譯器變量i可能被未知因素更改,i>0不必定成立,所以編譯器會完整編譯。