C 作用域 儲存期 鏈結

2021-09-24 11:32:11 字數 1896 閱讀 3287

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變數的作用域可以是塊作用域 函式作用域 函式原型作用域或檔案作用域。塊是用一對花括號括起來的 區域。例如,整個函式體是乙個塊,函式中的任意復合語句也是乙個塊。定義在塊中的變數具有塊作用域,塊作用域變數的可見範圍是從定義處到包含該定義的塊的末尾。另外...