1. 程式人生 > >C語言中,static關鍵字舉例——全域性static變數

C語言中,static關鍵字舉例——全域性static變數

C語言中,可以在全域性作用域中使用static關鍵字:被static關鍵字修飾的變數或函式,僅在本".c檔案"中可見,而在其他".c檔案"中,不可見。例如,在t1.c中的全域性作用域,定義static函式func,則在t2.c中,無法使用t1.c中定義的func函式,即使在t2.c中,使用extern關鍵字聲明瞭func函式。

實驗程式碼如下:

1、預設使用extern修飾符

/*file:t1.c*/

/*定義函式func,此時沒有使用任何修飾符,
**所以預設使用extern修飾
*/
void func(){}

/*file:t2.c*/

/*宣告func函式,該函式在t1.c中定義
**由於宣告的是函式,所以,此時extern關鍵字,可以省略
*/
extern void func();

int main(){

	func();//呼叫func函式
	
	return 0;
}

編譯結果:

編譯通過

2、使用static修飾後,則僅在本".c檔案"中可見

/*file:t1.c*/

/*定義函式func,此時使用static修飾*/
static void func(){}

/*file:t2.c*/

/*宣告func函式,該函式在t1.c中定義,且被用static修飾*/
extern void func();

int main(){

	func();//error.func在t2.c中不可見
	
	return 0;
}

編譯結果:


3、如何在“定義static函式的.c檔案”中,宣告static函式

從上面兩則例程中可以看出,static確實可以讓函式(或變數)僅在本“.c檔案”中可見,而在其他".c檔案"中不可見。然而經常地,我們需要“在某函式的定義程式碼之前,使用這個函式”,這就需要我們“宣告該函式,然後使用呼叫該函式,然後定義該函式”,所以,這就涉及到,如何宣告static函式,當然啦,肯定是在“定義該static函式的.c檔案中,宣告該static函式”。

/*file:t1.c*/

/***************************static宣告*******************************/
//static 宣告,static定義
static void func1();
static void func1(){}//func1是static函式,在其他.c檔案中,不可見

//static 宣告,預設定義
static void func2();
void func2(){}//func2也是static函式,在其他.c檔案中,不可見

//static 宣告,extern定義
static void func3();
extern void func3(){}//func3還是static,儘管它被定義為extern

/***************************extern宣告*******************************/
//extern 宣告,extern定義
extern void func4();
extern void func4(){}//func4是extern

//extern 宣告,預設定義
extern void func5();
void func5(){}//func5是extern

//extern 宣告,static定義
extern void func6();
static void func6(){}//func6是static

/****************************預設宣告*******************************/
//預設宣告,預設定義
void func7();
void func7(){}//func7是extern

//預設宣告,extern定義
void func8();
extern void func8(){}//func8是extern

//預設宣告,static定義
void func9();
static void func9(){}//func9是static

/*file:t2.c*/

/*宣告func[1-9]函式,這些函式在t1.c中定義*/
extern void func1();
extern void func2();
extern void func3();
extern void func4();
extern void func5();
extern void func6();
extern void func7();
extern void func8();
extern void func9();

int main(){

	//凡是被static定義/宣告的函式,都是static的,在其他".c檔案"中均不可見:
	
	func1();//error.func1在t2.c中不可見
	func2();//error.func2在t2.c中不可見
	func3();//error.func3在t2.c中不可見
	func4();
	func5();
	func6();//error.func9在t2.c中不可見
	func7();
	func8();
	func9();//error.func9在t2.c中不可見
	
	return 0;
}

編譯結果:


結論是:
1、使用static修飾的函式宣告或定義,都會將該函式變為static函式,僅可在本“.c檔案”中可見,如func1,func2,func3,func6,func9;
2、使用static修飾“未用static宣告”的函式的定義,則會得到warning,如func6和func9.