標籤:

C 語言,「static 函數在內存中只有一份,普通函數在每次調用中維持一份拷貝」,這話怎麼理解?


樓主看的書可能有點扯淡。

static這個關鍵詞,在c裡面有兩種意思。

(1)

一個是,用在函數的裡面,給予函數一種有記憶的狀態。

void f(){

static int a=1; //不論被調用多少次,只會被初始化一次。

// 這個a可以作為這個函數的狀態變數

}

不僅在c裡面有這種用法,c++裡面也有。

(2)

不過,按照樓主的說法,你想要問的情況應該是static的第二種含義。

這種用法在c++裡面是不建議使用的,因為這第二種用法,和static這個英文單詞不太符合。

在c裡面用得比較多。

第二種含義表示的是internal linkage.

這主要是因為c裡面,沒有namespace的概念,需要用這個來構造一種和namespace的隔離效果等效的東西。

簡單地說來。

現在假如有下面三個文件:

//file1.c

int f(int); // 聲明為 extern linkage ,與 extern int f(int); 是等價的。

int f(int i){

//...

//這裡函數的具體實現

}

//file2.c

static int f(int); //聲明為internal linkage

int f(int i){

//...

// 這裡是函數的具體實現

}

//file3.c

int f(int);

int main(){

f(1); // 調用 f(int)

return 0;

}

現在,分別編譯3個文件,得到:

file1.o file2.o , file3.o

你想要得到一個程序,比如,windows下面,一個exe,你需要鏈接(link)。

那麼,這裡你可以得到兩個不同的程序。

一個程序,必須要有main函數,所以,file3.o是必選的。

(1)

link file1.o 和 file3.o

那麼,file3 中想要引用一個函數,int f(int ),真的在file1.o里找到了。

鏈接成功,你能夠得到一個exe。

(2)

link file2.o 和 file 3.o

會失敗。

你可能覺得,鏈接器應該能在file2.o中也找到file3.o需要的 int f(int )啊?

具體實現我不清楚。

但是,結果就是拒絕鏈接了。

一般的提示是,鏈接器找不到f


私以為:

static修飾函數就只是改變了該函數的作用域(只能在該文件內可見),其它和普通函數沒區別。

至於題主的問題,看不懂,坐等高人解答。


static 和 inline沒啥關係。static 做為一個關鍵字,只是說這個函數不可外部鏈接而已,在運行時和普通函數一樣一樣的...


Dont throw out your book yet.

For regular functions, all the variables are stored on stack. So each time you call the function, you get a fresh new copy of that variable. i.e, the variable space is allocated at run time.

However, for static function.variable, its space is pre-allocated in code or data section during compile time. You have only 1 copy of this variable even the correspondent function is never called.


我怎麼覺得剛好相反?

普通函數在內存中只有一份,satic函數在每次調用中維持一份拷貝&


推薦閱讀:

如何深入學習C++?
PS教程:創建一個James White風格懷舊海報
c語言初學者,接下來的路該怎麼走?
how to 製作ps仿古風棉麻版

TAG:C編程語言 | CC |