static关键字有两个完全不同的功能
- 对于局部变量,用static声明,表示变量和全局变量一样,分配在静态存储区,这个变量在整个程序执行期间不释放。因此在调用时一定要注意static变量的值。
- 对于全局变量,使用static声明,表示此变量的作用域仅限于本文件。(和extern相对应,表示声明(declare)这个变量,且这个变量在其他文件内已经定义(define))。同样可以修饰函数,函数默认是extren类型,外部可以调用,如果声明为static,该函数只可以在本文件内调用。
例子一:
#include<stdio.h>
int fun1()
{
int i = 0;
i++;
return i;
}
int fun2()
{
static int j = 0;
j++;
return count;
}
int main()
{
printf("%d ", fun1());
printf("%d ", fun1());
printf("%d ", fun2());
printf("%d ", fun2());
return 0;
}
输出:
1 1 1 2
例子二:
// main.c
#include<stdio.h>
int foo = 0;
int fun1()
{
int i = 0;
i++;
return i;
}
// test.c
#include<stdio.h>
int foo = 0;
int fun1()
{
int i = 0;
i++;
return i;
}
运行程序:
duplicate symbol '_foo' in:
CMakeFiles/untitled.dir/main.cpp.o
CMakeFiles/untitled.dir/test.cpp.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
相同名称的全局变量会冲突,解决方法就是使用static修饰,表明该变量只在这个文件中生效。
// test.c
#include<stdio.h>
static int foo = 0;
int fun1()
{
int i = 0;
i++;
return i;
}