C語言 作用域 儲存期 鏈結

2021-08-04 06:31:32 字數 2198 閱讀 7063

作用域描述程式中可訪問識別符號的區域。乙個c變數的作用域可以是塊作用域、函式作用域、函式原型作用域或檔案作用域。

翻譯單元和檔案

通常認為的多個檔案在編譯器中可能以乙個檔案出現。例如,通常在源**(.c副檔名)中包含乙個或多個標頭檔案(.h 副檔名)。標頭檔案會依次包含其他標頭檔案,所以會包含多個單獨的物理檔案。但是,c預處理實際上是用包含的標頭檔案內容替換#include指令。所以,編譯器源**檔案和所有的標頭檔案都看成是乙個包含資訊的單獨檔案。這個檔案被稱為翻譯單元(translation unit)。描述乙個具有檔案作用域的變數時,它的實際可見範圍是整個翻譯單元。如果程式由多個源**檔案組成,那麼該程式也將由多個翻譯單元組成。每個翻譯單元均對應乙個源**檔案和它所包含的檔案。

具有塊作用域、函式作用域或函式原型作用域的變數都是無鏈結變數。這意味著這些變數屬於定義它們的塊、函式或原型私有。

具有檔案作用域的變數可以是外部鏈結或內部鏈結。外部鏈結變數可以在多檔案程式中使用,內部鏈結變數只能在乙個翻譯單元中使用。

int giants = 5;       // 檔案作用域,外部鏈結

static

int dodgers = 3;   // 檔案作用域,內部鏈結

int main()

...

作用域和鏈結描述了識別符號的可見性。儲存期描述了通過這些識別符號訪問的物件的生存期。

c物件有4種儲存期:靜態儲存期、執行緒儲存期、自動儲存期、動態分配儲存期。

如果物件具有靜態儲存期,那麼它在程式的執行期間一直存在。檔案作用域變數具有靜態儲存期。注意,對於檔案作用域變數,關鍵字 static表明了其鏈結屬性,而非儲存期。以static宣告的檔案作用域變數具有內部鏈結。但是無論是內部鏈結還是外部鏈結,所有的檔案作用域變數都具有靜態儲存期。

執行緒儲存期用於併發程式設計,程式執行可被分為多個執行緒。具有執行緒儲存期的物件,從被宣告時到執行緒結束一直存在。以關鍵字_thread_local宣告乙個物件時,每個執行緒都獲得該變數的私有備份。

塊作用域的變數通常都具有自動儲存期。當程式進入定義這些變數的塊時,為這些變數分配記憶體;當退出這個塊時,釋放剛才為變數分配的記憶體。這種做法相當於把自動變數占用的記憶體視為乙個可重複使用的工作區或暫存區。例如,乙個函式呼叫結束後,其變數占用的記憶體可用於儲存下乙個被呼叫函式的變數。變長陣列稍有不同,它們的儲存期從宣告處到塊的末尾,而不是從塊的開始處到塊的末尾。

靜態變數(static variable)聽起來像是乙個不可變的變數。實際上,靜態的意思是該變數在記憶體中原地不動,並不是說它的值不變。

具有檔案作用域的變數自動具有(也必須是)靜態儲存期。

可以建立具有靜態儲存期、塊作用域的區域性變數。這些變數和自動變數一樣,具有相同的作用域,但是程式離開它們所在的函式後,這些變數不會消失。也就是說,這種變數具有塊作用域、無鏈結,但是具有靜態儲存期。計算機在多次函式呼叫之間會記錄它們的值。在塊中(提供塊作用域和無鏈結)以儲存類別說明符static(提供靜態儲存期)宣告這種變數

外部鏈結的靜態變數具有檔案作用域、外部鏈結和靜態儲存期。該類別有時稱為外部儲存類別(external storage class),屬於該類別的變數稱為外部變數(external variable)。把變數的定義性宣告(defining declaration)放在在所有函式的外面便建立了外部變數。當然,為了指出該函式使用了外部變數,可以在函式中用關鍵字extern再次宣告。如果乙個源**檔案使用的外部變數定義在另乙個源**檔案中,則必須用extern在該檔案中宣告該變數。

如下所示:

int errupt;        /* 外部定義的變數 */

double up[100];      /* 外部定義的陣列 */

extern

char coal;     /* 如果coal被定義在另乙個檔案,則必須這樣宣告 */

void next(void);

int main(void)

void next(void)

注意,在main()中宣告up陣列時(這是可選的宣告)不用指明陣列大小,因為第1次宣告已經提供了陣列大小資訊。main()中的兩條 extern 宣告完全可以省略,因為外部變數具有檔案作用域,所以errupt和up從宣告處到檔案結尾都可見。它們出現在那裡,僅為了說明main()函式要使用這兩個變數。

c語言 作用域 鏈結 儲存期

作用域 作用域描述程式中可訪問識別符號的區域。乙個c變數的作用域可以是塊作用域 函式作用域 函式原型作用域或檔案作用域。塊是用一對花括號括起來的 區域。例如,整個函式體是乙個塊,函式中的任意復合語句也是乙個塊。定義在塊中的變數具有塊作用域,塊作用域變數的可見範圍是從定義處到包含該定義的塊的末尾。另外...

C 作用域 儲存期 鏈結

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

作用域 鏈結 儲存期

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