extern和static的理解

2021-07-27 03:50:09 字數 1414 閱讀 1242

extern可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。

我們要在檔案1中定義了乙個變數,而在檔案2中需要用到,這該怎麼辦?

只需要在使用時在變數前面加上extern即可,提示編譯器這是從另乙個檔案中分拿出來的變數。不過這裡需要注意一點,這裡的變數只能宣告,不能給他初始化。

#include int a;//在file1.c裡定義了乙個變數

int func1()

/***************************************/

extern a;//宣告a為乙個已經定義的外部變數

extern a=0;//錯誤

int func2()

static的作用和extern正好是相對的。在c中,static主要定義全域性靜態變數、定義區域性靜態變數、定義靜態函式。

我們要是在檔案1中定義乙個變數,又不想讓其在其他檔案中使用,咋辦?

只要在定義變數的時候,前面加上static即可。

static int a;//靜態全域性變數,作用域只限於在本檔案中

int func()

//由於file1.c裡面定義的a為static型別,因此即使在此宣告a為extern外部變數,仍然不能享有此資源--file1.c裡的a變數.

extern int a;

func2()

1、定義全域性靜態變數:在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數,每一次值得修改都會保留結果。全域性靜態變數有以下特點。

a.在全域性區分配記憶體。

b.如果沒有初始化,其預設值為0.

c.該變數在本檔案內從定義開始到檔案結束可見。

2、定義區域性靜態變數:在區域性變數前面加上關鍵字static,其特點如下:

a.該變數在全域性資料區分配記憶體。

b.它始終駐留在全域性資料區,直到程式執行結束。

c. 其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。

3、定義靜態函式:在函式返回型別前加上static關鍵字,函式即被定義為靜態函式,其特點如下:

a.靜態函式只能在本原始檔中使用

b.在檔案作用域中宣告的inline函式預設為static型別

在c++中stati又增加了兩個作用:

定義靜態資料成員:

a.記憶體分配:靜態資料成員在程式的全域性資料去分配。

b.初始化和定義:靜態資料成員定義時要分配空間,所以不能在類宣告中定義。

靜態成員函式:靜態成員函式與類相聯絡,不與類的物件相聯絡。靜態成員函式不能訪問非靜態資料成員。

static和extern的區別

static 一 在c中,static主要定義全域性靜態變數 定義區域性靜態變數 定義靜態函式。1 定義全域性靜態變數 在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點。a.在全域性區分配記憶體。b.如果沒有初始化,其預設值為0.c.該變數在本檔案內...

static和extern的區別

static 一 在c中,static主要定義全域性靜態變數 定義區域性靜態變數 定義靜態函式。1 定義全域性靜態變數 在全域性變數前面加上關鍵字static,該全域性變數變成了全域性靜態變數。全域性靜態變數有以下特點。a.在全域性區分配記憶體。b.如果沒有初始化,其預設值為0.c.該變數在本檔案內...

static和extern的使用

1 修飾區域性變數 static修飾區域性變數,該區域性變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束,但作用域仍限於該語句塊。特別注意的是,用static修飾區域性變數後,該變數只在初次執行時進行初始化工作,且只進行一次。includevoid fun int main void 程...