c語言 作用域、儲存期、鏈結屬性
作用域和鏈結描述了識別符號的可見性,作用域描述了這些識別符號的作用範圍,儲存期描述了通過這些識別符號訪問的物件的生存期。
1、作用域
塊作用域:用{}闊起來的,從宣告開始到「}」 結束
函式作用域:goto(識別符號) 的作用域為整個函式。
函式原型作用域:函式宣告開始,函式宣告結束而結束
檔案作用域:整個檔案或者程式
2、鏈結
3、儲存期
靜態儲存期:在整個程式都是占有記憶體的
執行緒儲存期:thread_local,其宣告後會給每個執行緒分配乙個單獨的私有備份
自動儲存期:區域性變數通常都自動為auto 儲存期
動態儲存期:就是用new 或者malloc分配的記憶體,如果不主動釋放,在整個程式都占有記憶體
4、總結
儲存類別 儲存期 作用域 鏈結屬性 表示
自動 自動 塊 無鏈結 塊內宣告變數
暫存器 自動 塊 無鏈結 塊內使用register修飾
靜態外鏈結 靜態 檔案 外鏈結 所有函式外
靜態內鏈結 靜態 檔案 內鏈結 所有函式外,用static修飾
靜態無鏈結 靜態 塊 無鏈結 塊內,使用static修飾
執行緒儲存 自動 執行緒 無鏈結 thread_local修飾
4、函式的儲存期
外部函式:預設都是外部函式
靜態函式:使用static 修飾,內連線
內聯函式:inline
5、注意
auto 在c中表示自動儲存期, 但是auto在c++11 中表示自動推斷型別
register 宣告後,並不一定會存到暫存器中,他只是一種請求。及時不存在暫存器中也不能對其取位址。同時可以存為register的型別可不多, 因為有些型別太大了,暫存器存不下。暫存器變數是儲存在cpu的暫存器中,比普通變數能更快地被訪問和處理,和自動變數一樣,都是塊作用域、無鏈結和自動儲存期。
靜態變數或者全域性常量,都儲存在靜態區,在程式載入時已經執行賦值了 ,他們如果不被初始化,將會被初始化為0,存在bss段中。
4)如果物件具有靜態儲存期,那麼它在程式的執行期間一直存在。檔案作用域變數具有靜態儲存期。注意,對於檔案作用域變數,關鍵字static表明了其鏈結屬性,而非儲存期。以static宣告的檔案作用域變數具有內部鏈結。但是無論是內部鏈結還是外部鏈結,所有的檔案作用域變數都具有靜態儲存期。
6、申請記憶體
malloc:malloc(sizeof(***))
calloc:calloc(num,sizeof(xx))
realloc: realloc(p,size)
7、限定符
volatile
const:
restrict:
作用域 鏈結 儲存期
作用域,分四種 1.塊作用域 block scope 2.函式作用域 function scope 僅限於goto的標籤 3.函式原型作用域 function prototype scope 3.檔案作用域 file scope 在函式和類之外的說明的識別符號具有檔案作用域,其作用域從說明點開始,在...
C語言 作用域 儲存期 鏈結
作用域描述程式中可訪問識別符號的區域。乙個c變數的作用域可以是塊作用域 函式作用域 函式原型作用域或檔案作用域。翻譯單元和檔案 通常認為的多個檔案在編譯器中可能以乙個檔案出現。例如,通常在源 c副檔名 中包含乙個或多個標頭檔案 h 副檔名 標頭檔案會依次包含其他標頭檔案,所以會包含多個單獨的物理檔案...
c語言 作用域 鏈結 儲存期
作用域 作用域描述程式中可訪問識別符號的區域。乙個c變數的作用域可以是塊作用域 函式作用域 函式原型作用域或檔案作用域。塊是用一對花括號括起來的 區域。例如,整個函式體是乙個塊,函式中的任意復合語句也是乙個塊。定義在塊中的變數具有塊作用域,塊作用域變數的可見範圍是從定義處到包含該定義的塊的末尾。另外...