static與extern的用法

2021-06-21 13:49:02 字數 1917 閱讀 1863

static是c++中常用的修飾符,它被用來控制變數的存貯方式和可見性。extern, "c"是使c++能夠呼叫c寫作的庫檔案的乙個手段,如果要對編譯器提示使用c的方式來處理函式的話,那麼就要使用extern "c"來說明。

一.c語言中的static關鍵字

在c語言中,static可以用來修飾區域性變數,全域性變數以及函式。在不同的情況下static的作用不盡相同。

(1)修飾區域性變數

一般情況下,對於區域性變數是存放在棧區的,並且區域性變數的生命週期在該語句塊執行結束時便結束了。但是如果用static進行修飾的話,該變數便存放在靜態資料區,其生命週期一直持續到整個程式執行結束。但是在這裡要注意的是,雖然用static對區域性變數進行修飾過後,其生命週期以及儲存空間發生了變化,但是其作用域並沒有改變,其仍然是乙個區域性變數,作用域僅限於該語句塊。

在用static修飾區域性變數後,該變數只在初次執行時進行初始化工作,且只進行一次。

如:

#include

void

fun()  

intmain(

void

)    

程式執行結果為: 2  3

說明在第二次呼叫fun()函式時,a的值為2,並且沒有進行初始化賦值,直接進行自增運算,所以得到的結果為3.

對於靜態區域性變數如果沒有進行初始化的話,對於整形變數系統會自動對其賦值為0,對於字元陣列,會自動賦值為'\0'.

(2)修飾全域性變數

對於乙個全域性變數,它既可以在本原始檔中被訪問到,也可以在同乙個工程的其它原始檔中被訪問(只需用extern進行宣告即可)。

如:

//有file1.c 

inta=1;  

file2.c  

#include

extern

inta;  

intmain(

void

)   

則執行結果為 1

但是如果在file1.c中把int a=1改為static int a=1;

那麼在file2.c是無法訪問到變數a的。原因在於用static對全域性變數進行修飾改變了其作用域的範圍,由原來的整個工程可見變為本原始檔可見。

(3)修飾函式

用static修飾函式的話,情況與修飾全域性變數大同小異,就是改變了函式的作用域。

二.c++中的static

在c++中static還具有其它功能,如果在c++中對類中的某個函式用static進行修飾,則表示該函式屬於乙個類而不是屬於此類的任何特定物件;如果對類中的某個變數進行static修飾,表示該變數為類以及其所有的物件所有。它們在儲存空間中都只存在乙個副本。可以通過類和物件去呼叫。

三.extern關鍵字

在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。

在上面的例子中可以看出,在file2中如果想呼叫file1中的變數a,只須用extern進行宣告即可呼叫a,這就是extern的作用。在這裡要注意extern宣告的位置對其作用域也有關係,如果是在main函式中進行宣告的,則只能在main函式中呼叫,在其它函式中不能呼叫。其實要呼叫其它檔案中的函式和變數,只需把該檔案用#include包含進來即可,為啥要用extern?因為用extern會加速程式的編譯過程,這樣能節省時間。

在c++中extern還有另外一種作用,用於指示c或者c++函式的呼叫規範。比如在c++中呼叫c庫函式,就需要在c++程式中用extern 「c」宣告要引用的函式。這是給鏈結器用的,告訴鏈結器在鏈結的時候用c函式規範來鏈結。主要原因是c++和c程式編譯完成後在目標**中命名規則不同,用此來解決名字匹配的問題。

外部變數,變數定義在其他檔案中     extern

全域性變數,所有函式都可以使用 global

靜態變數,作用域在函式中,每次儲存上次函式結束時的值,這一點跟全域性變數類似 static

extern 與 static 用法總結

資料1 1 概念基礎 區域性變數 函式內部定義的變數 包括定義在函式內部復合語句中的變數 全域性變數 定義在函式外部的變數。作用域 任何識別符號 包括變數 函式名 符號常量及新的資料名 都有它的作用範圍,此範圍稱為該識別符號的作用域。比如符號常量的作用域是從定義符號 常量的地方開始到包含這個 def...

c語言static與extern的用法

一,static和extern 大工程下我們會碰到很多原始檔。檔案a.c static int i 只在a檔案中用 int j 在工程裡用 static void init 只在a檔案中用 void callme 在工程中用 上面的全域性i變數和init 函式只能用在a.c檔案中,全域性變數sum的...

c語言static與extern的用法

一,static和extern 大工程下我們會碰到很多原始檔。檔案a.c static int i 只在a檔案中用 int j 在工程裡用 static void init 只在a檔案中用 void callme 在工程中用 上面的全域性i變數和init 函式只能用在a.c檔案中,全域性變數sum的...