深入理解作用域 鏈結 儲存期

2021-10-05 18:03:59 字數 1615 閱讀 4087

塊作用域:

塊的定義為{}括起來的部分,不了是函式定義,struct,還是在內部定義,只有{}括起來的,都是block

int c1=5;

printf

("c1=%d"

,c1)

;

檔案作用域(file scope)

在函式之外的識別符號或者{}之外,在整個檔案是可見的,從定義或者宣告開始,一直到檔案結束即檔案內的函式或者語句塊均

可以引用

#include

int units=0;

void

calc

(void);

//declaration

intmain

(int ar**,

char

**ar**)

//definination

void

calc

(void

)//j=10; error ,j is invisible

return i;

}

函式原型作用域

int

setvalue

(int pos,

char

*string)

;//declaration, 在宣告時可以忽略,

intsetvalue

(int

,char*)

//在函式定義時在寫上具體的引數名

儲存期(storage duration)

auto:automatic duration and no linkage ()

register:automatic duaration and no linkage;address of this variable cannot be taken

static:static duration and internal linkage(unless at block scope)

extern:static duration and external linkage(unless already declared internal)

_thread_local:thread storage duration

extern

int valuepos;

void

getvalue

(int pos,

char

* src)

三者之間的聯絡和區別:

1:看乙個識別符號,首先要看作用域,在作用域範圍,在看對應的儲存期和鏈結型別

對檔案作用域的,用static和extern只是來確定其鏈結型別,不是用來限定儲存期的,其儲存期對應的就是static storage duration

對塊作用域的,其鏈結型別是無鏈結,對應的儲存期是automatic,即在塊作用域之外,其lifecycle已經結束。如果用static來修飾塊作用域的identifer,表明只是塊作用域有效,但對編譯單元而已,在編譯時會放入目標檔案的資料段,用extern來修飾identifier,只是表明這個identifier在外部進行定義,編譯時進行留空,在鏈結時引入其他目標檔案的符號,找到位置

作用域 鏈結 儲存期

作用域,分四種 1.塊作用域 block scope 2.函式作用域 function scope 僅限於goto的標籤 3.函式原型作用域 function prototype scope 3.檔案作用域 file scope 在函式和類之外的說明的識別符號具有檔案作用域,其作用域從說明點開始,在...

linux c儲存期 作用域 鏈結

儲存期 靜態儲存期分配的內存在程式執行期間一直存在 執行緒儲存期分配的記憶體從執行緒生成到執行緒結束之前一直存在 自動儲存期物件一般在塊裡面,當程式進入這個塊時分配記憶體,退出這個塊時就釋放記憶體 動態儲存期手動分配記憶體和釋放記憶體 malloc,calloc 檔案作用域 全域性 塊作用域可見範圍...

C 作用域 儲存期 鏈結

c語言 作用域 儲存期 鏈結屬性 作用域和鏈結描述了識別符號的可見性,作用域描述了這些識別符號的作用範圍,儲存期描述了通過這些識別符號訪問的物件的生存期。1 作用域 塊作用域 用 闊起來的,從宣告開始到 結束 函式作用域 goto 識別符號 的作用域為整個函式。函式原型作用域 函式宣告開始,函式宣告...