C中的static的作用,要根据上下文有所不同
1. 如果修饰代码块外的变量或函数,是修改该变量或函数的链接属性,让他们只在当前源文件内可以访问,在其他源文件不可访问,因为默认的情况下,在所有代码块外的变量或函数都是external的,在其他的源文件中都可以访问,加上static的修饰,让他们变成internal的,只在本源文件可用,比如下面的代码,在第3行,第5行加了static修饰符,使他们通过其他文件无法访问:
1 #include <stdio.h>
2
3 static int a;
4 int b;
5 static int func(int n);
6
7 int main (int argc, char *argv[])
8 {
9 printf("hello world!");
10
11 return 0;
12 }
13
14 int func1(int n)
15 {
16 return 0;
17 }
2. 当static用在代码块内的变量修饰时,表明这个变量时一个静态变量,存储在静态存储区,这种情况下相当于改变了变量的存储属性,因为默认的情况下,代码块内的变量为自动变量(auto),存储在运行时的栈中,加上static修饰,他就存储在静态存储区,在程序运行之前创建,在整个运行期间都存在,但这并不改变他的作用域。比如下面的代码,在第13行声明了一个局部静态变量:
1 #include <stdio.h>
2
3
4 int main (int argc, char *argv[])
5 {
6 printf("hello world!");
7
8 return 0;
9 }
10
11 int func1(int n)
12 {
13 static int a;
14 return 0;
15 }
顺便说一句,在C++中,通常用static来修饰类的函数成员或数据成员,他的作用是表明这个函数或数据成员是属于这个类的,而不是属于某个特定实例对象的,可以通过 类名::func来直接访问。