天天看点

详解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,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏。该函数又称为“内部函数”

对于变量来讲,static有以下三点作用:

1. 存储方式的改变, 局部变量一般都在栈空间分配空间,跳出作用域后会回收空间, static修饰后,变为静态变量,存放在静态数据区,具有全局属性,其实在程序运行前,该变量已被分配空间并且初始化(如不显示初始化会按照0初始化)

2. 作用域改变,static修饰变量后,该变量只在当前文件中有效, 好处在于,工程项目由多人开发时,可能存在同名的变量,通过使用static修饰可以将变量作用域限制在本文件中。

继续阅读