在C語言中,static的字面意思很容易把我們導入歧途羹应,其實它的作用有三條揽碘。
(1)第一個作用:隱藏。
當我們同時編譯多個文件時园匹,所有未加static前綴的全局變量和函數(shù)都具有全局可見性雳刺。為理解這句話,我舉例來說明裸违。我們要同時編譯兩個源文件掖桦,一個是a.c,另一個是main.c供汛。
下面是a.c的內(nèi)容
#include增加這條語句
char a = ‘A‘; // global variable
void msg()
{
printf("Hello\n");
}
你可能會問:為什么在a.c中定義的全局變量a和函數(shù)msg能在main.c中使用枪汪?前面說過,所有未加static前綴的全局變量和函數(shù)都具有全局可見性怔昨,其它的源文件也能訪問雀久。此例中,a是全局變量趁舀,msg是函數(shù)赖捌,并且都沒有加static前綴,因此對于另外的源文件main.c是可見的赫编。
如果加了static巡蘸,就會對其它源文件隱藏奋隶。例如在a和msg的定義前加上static擂送,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數(shù)和同名變量唯欣,而不必擔心命名沖突嘹吨。Static可以用作函數(shù)和變量的前綴,對于函數(shù)來講境氢,static的作用僅限于隱藏蟀拷,而對于變量,static還有下面兩個作用萍聊。
(2)static的第二個作用是保持變量內(nèi)容的持久问芬。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化寿桨。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量此衅,只不過和全局變量比起來强戴,static可以控制變量的可見范圍,說到底static還是用來隱藏的挡鞍。
(3)static的第三個作用是默認初始化為0骑歹。其實全局變量也具備這一屬性,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)墨微。在靜態(tài)數(shù)據(jù)區(qū)道媚,內(nèi)存中所有的字節(jié)默認值都是0x00,某些時候這一特點可以減少程序員的工作量翘县。
最后對static的三條作用做一句話總結(jié)最域。首先static的最主要功能是隱藏,其次因為static變量存放在靜態(tài)存儲區(qū)锈麸,所以它具備持久性和默認值0羡宙。
下面是main.c的內(nèi)容
除了頭文件,需要聲明函數(shù):void msg();
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}