詳解C/C++語言中Static 變量 或者 static函數的作用


1. 今天被問到C語言中Static假如修飾一個函數的話,這個Static 起到什麼作用。

之前因爲特別注意到這個問題,但一時之間可能說不出全部,我回答了關於 作用域的區別,其實是對的,因爲其他文件無法訪問這個函數了,static把這個函數侷限於在這個文件當中,某種意義上“隱藏了”這個函數,但不夠具體。 


在某個文件中,例如a.cc文件中,假如我們定義如下

char a = 'A'// global variable
void msg() 
{
    printf(
"Hello\n"); 
}


在main.cc文件中我們可以

int main(void)
{    
    
extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (
void)msg();
    
return 0;
}

程序的運行結果是:

A Hello

你可能會問:爲什麼在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,所有未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,並且都沒有加static前綴,因此對於另外的源文件main.c是可見的。

如果加了static,就會對其它源文件隱藏。例如在amsg的定義前加上staticmain.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名衝突。Static可以用作函數和變量的前綴,對於函數來講,static的作用僅限於隱藏。該函數又稱爲“內部函數”


對於變量來講,static有以下三點作用:

1. 存儲方式的改變, 局部變量一般都在棧空間分配空間,跳出作用域後會回收空間, static修飾後,變爲靜態變量,存放在靜態數據區,具有全局屬性,其實在程序運行前,該變量已被分配空間並且初始化(如不顯示初始化會按照0初始化)

2. 作用域改變,static修飾變量後,該變量只在當前文件中有效, 好處在於,工程項目由多人開發時,可能存在同名的變量,通過使用static修飾可以將變量作用域限制在本文件中。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章