說一說C語言中的變數儲存型別 「extern」

2021-10-05 19:31:25 字數 2096 閱讀 1442

請看下文

c語言中的變數有哪些儲存型別,你還記得嗎?extern如何使用你都掌握了嗎?看了本文你就清楚了。

1、 回顧c語言變數

c語言中變數值的儲存位置有兩類:cpu的暫存器和記憶體。變數儲存型別關係到其儲存位置,除了register型儲存在cpu暫存器中,c語言提供的其它三種儲存型別(auto型、static型、extern型)的變數均儲存在記憶體中。儲存位置不同,決定了變數的生存期和作用域。

從時間角度來說,c語言中變數分為靜態儲存和動態儲存兩種情況。靜態儲存指的是變數儲存在記憶體的靜態儲存區,程式編譯時就為其分配空間並初始化,占有固定儲存單元直至程式結束。而動態儲存指的是變數儲存在記憶體的動態儲存區,一般用於儲存函式中的臨時變數(宣告為static型的變數除外),只有函式被呼叫,此型別變數才被分配空間,函式呼叫結束時該變數空間將會被釋放。

從空間角度來說,c語言中變數分為區域性變數和全域性變數,其有效作用範圍稱為作用域。區域性變數通常定義在函式內部或符合語句內,其僅在函式內部或符合語句內有效,程式編譯階段不會給其分配空間,僅在執行階段臨時分配,執行結束即釋放空間。全域性變數指的是在函式以外定義的變數,其作用範圍為從定義處開始到所在程式檔案結束。編譯階段開始分配固定空間,程式執行期間始終占有該空間不變。

整體來講,全域性變數和宣告為static型的區域性變數儲存在記憶體的靜態儲存區;區域性變數儲存在記憶體的動態儲存區。

2、 extern的變數宣告

我們知道,在函式外部定義的變數稱為全域性變數,其儲存方式為靜態儲存,生存期為整個程式的執行週期,作用範圍即作用域為從定義處到所在檔案結束。那麼我們想在全域性變數作用範圍之外使用它該怎麼辦呢?事實上,c語言中extern關鍵字就是用作「外部變數宣告」,起到擴充套件外部變數作用域的作用。

通常c語言是以原始檔為編譯單位的,乙個程式可以包含乙個或多個原始檔,每個原始檔包含乙個或多個函式。但是程式不管有幾個原始檔,extern的用法都是相同的,我們分這兩種情況來說明。

1) 單個原始檔的情況

對於單個原始檔的程式,如果某個全域性變數不是在檔案開頭定義,而是在中間某個位置,那麼如果在定義位置之前的函式想使用這個全域性變數,則可以採用extern來宣告變數。例如,下面示例程式中全域性變數g_a定義在main函式之後,要想在main函式中使用已經超出了g_a的作用域,這裡就可以採用extern宣告,即可使用,程式輸出結果為10。

#include

void prtvalue(int x);

int main(void)

extern int g_a;

prtvalue(g_a);

return 0;

int g_a = 10;

void prtvalue(int x)

printf(「%d」,x);

2) 多個原始檔情況

假定某程式包含file1.c和file2.c兩個檔案。file1.c檔案中定義了乙個int型全域性變數g_b,如果file2.c檔案中某函式想使用g_b變數,只需要在file2.c檔案的使用位置之前(通常為檔案開頭位置)通過「extern int g_b;」語句進行外部變數宣告即可使用。

如果某程式包含多個原始檔(模組),乙個原始檔中定義了全域性變數,其它多個原始檔均需要使用該全域性變數,只需要在各使用此全域性變數的檔案中通過extern對全域性變數進行宣告即可使用。值得注意的是,這種情況下涉及到多個檔案對乙個變數的操作,某個檔案修改了變數的值,可能會影響其他檔案的使用,需謹慎使用。

3、 其它使用

此外extern也可用於函式的外部鏈結宣告。我們知道函式的宣告(定義)也可以包括儲存型別,但只有extern/static兩種。當函式宣告為extern,說明函式具有外部鏈結,其它檔案可以呼叫此函式;當函式宣告為static,說明函式是內部鏈結,即只能在定義函式的檔案內部呼叫函式;當不指明函式儲存型別,則預設該函式具有外部鏈結。通過如下宣告語句,我們看到函式fun1和fun3都具有外部鏈結,因此,如果不限定函式為內部鏈結的情況下,也無需通過extern特意宣告為外部鏈結,因為它預設已經具有外部鏈結了。

extern int fun1(int x); //外部鏈結

static int fun2(char c); //內部鏈結

int fun3(int i); //外部鏈結

C語言中變數的儲存型別

變數的儲存型別 storage class 是指儲存變數值的記憶體型別。有三個地方可以用於儲存變數 普通記憶體 執行時堆疊 硬體暫存器 用於宣告變數儲存型別的關鍵字 auto static register 在所有 塊之外的變數的預設儲存型別是靜態的 static 儲存於靜態記憶體中,稱為靜態 st...

c語言中的儲存型別

auto 自動型別 在定義變數的時候,變數前預設就是auto auto int a 等於 int a 非自動型別的變數 1.全域性變數 2.static修飾的變數 register 暫存器型別的變數 register int a 暫存器型別的變數,要不普通的變數執行效率要高。在乙個soc syste...

C語言中變數儲存型別和生存週期

本博文基於vc 6.0開發,除錯,執行 內容來自譚浩強的 c語言程式設計 總結 資料型別 浮點型,整型,字元型等都是乙個資料型別 資料儲存型別 資料在記憶體中的儲存方式 這是本博文要討論的重點 注意 資料型別和資料儲存型別都是針對於宣告或定義的函式和變數而言的 靜態儲存型別 變數或函式,在程式執行期...