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,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。该函数又称为“内部函数”
对于变量来讲,static有以下三点作用:
1. 存储方式的改变, 局部变量一般都在栈空间分配空间,跳出作用域后会回收空间, static修饰后,变为静态变量,存放在静态数据区,具有全局属性,其实在程序运行前,该变量已被分配空间并且初始化(如不显示初始化会按照0初始化)
2. 作用域改变,static修饰变量后,该变量只在当前文件中有效, 好处在于,工程项目由多人开发时,可能存在同名的变量,通过使用static修饰可以将变量作用域限制在本文件中。