C語言中static和extern

2021-09-27 01:27:42 字數 3286 閱讀 3988

c中的關鍵字extern是用來做變數宣告的, 宣告extern關鍵字的全域性變數和全域性函式可以使得它們的作用域得到擴充套件, 全域性變數和全域性函式預設是extern所以宣告時我們一般不寫 

c中的關鍵字static主要用於修飾普通變數和函式(c++中則主要修飾類的成員變數和函式)

不管在c還是c++中static靜態變數都儲存在靜態區(全域性區)

一. extern修飾全域性變數(大多數時候被省略的關鍵字)

在c中, 如果全域性變數不在檔案開頭定義, 其有效作用範圍(作用域)只限於全域性變數定義處到檔案結束, 在定義處之前不能使用該變數 ,如需在定義處之前想用該全域性變數的話, 需要在用之前用extern對該變數進行外部變數宣告, 表示將此變數的作用域擴充套件到此位置, 這樣就合法了

來看**

main.c

#define _crt_secure_no_warnings

#include#includeint max();

int main()

int a, b;

int max()

我們加上extern之後再看

這就可以了

乙個c程式可以由乙個或多個原始檔組成, 如果由多個組成, 那麼在想在乙個檔案用另乙個檔案中定義的全域性變數怎麼辦呢?

如果在兩個檔案中都定義名字相同的變數, 會在連線時出現重複定義的錯誤, 正確的做法是, 在任意乙個檔案中在全域性變數前加上extern修飾, 這樣實際只定義了乙個全域性變數, 只是將其作用域擴充套件到了其他檔案

來看**:

int b = 2;//全域性成員預設是extern,所以可以省略

extern int c = 3;

main.c

#include#includeextern b;//

int c;

int main()

將test.c和main.c放在同乙個工程下 . 

二. extern修飾函式(可以省略,一般不寫)

在宣告函式時, 在函式最左端加關鍵字extern, 此函式就成為了外部函式, 可供其他檔案呼叫

(與之對應的是內部函式, 用staic修飾, 文章下面再來看)

來看看具體怎麼用, 看** :

一 .static修飾變數

注意:在用static宣告變數時, 只能在宣告變數的基礎上加static修飾, 而不能單獨使用, 例如 下面用法不對

int a;

static a;

在c中和static類似不能這樣用的關鍵字還有auto ,register

static修飾全域性變數改變的是全域性變數的作用域, 使全域性變數只能在本檔案中使用,

來看下面**

執行結果出錯, 可以看到static確實把a的作用域限定到了test.c中

static修飾區域性變數, 會將區域性變數儲存在靜態區(全域性區)(普通區域性變數儲存在棧區), 改變區域性變數的生命週期, 使其伴隨整個程式, 程式執行結束時才會被釋放

注意 : 雖然static修飾的區域性變數改變了生命週期, 使其伴隨整個程式, 程式結束前為其分配的空間一直都在, 但作用域並未改變

來看**

#include#includevoid test() 

int main()

二. static修飾函式

在宣告函式時在其最左邊加static修飾, 這個函式就成了內部函式, 內部函式又稱為靜態函式, 會使函式作用域只限定於本檔案., 這樣在不同檔案中就算有相同名字的函式也不會相互干擾

通常乙個大的程式往往由多人分工來編寫不同的檔案模組, 在不同人編寫**時,很可能會出現相同名字的函式, 此時, 在自己寫的函式前加static修飾, 就不會出現函式重名的問題了, 這就保證了程式的可靠性.

來看例子

我們看到, 在mian.c中確實訪問不到test.c中的static函式了

c語言中static 用法和extern

static在c裡面可以用來修飾變數,也可以用來修飾函式。先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區 棧和堆裡。其實我們平時所說的堆疊是棧而不是堆,不要弄混。int a int main a是全域性變數,b是棧變數,c是堆變數。static對全域性變數的修飾,可以認為是限制了只能是本...

c語言中static型別

靜態變數都儲存與靜態儲存區中。1.靜態區域性變數 靜態區域性變數屬於靜態儲存方式,它具有以下特點 1 靜態區域性變數在函式內定義 它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後,儘管該變數還繼續存在,但不能使用它。2 允許對構造類靜態區域性量賦...

C語言中static相關

1.對於全域性static變數,初始化 首先是全域性變數,被初始化為0,其次是static也被初始化為0 存放位置 存放於記憶體的靜態區。作用域 開始於定義位置,終止於檔案的結尾。本檔案之內在沒有定義此static全域性變數之前,想使用的話需要加extern宣告。最好在檔案開始處就定義,避免使用ex...