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.