1、 初始化。
全局static变量的初始化在编译的时候进行。在main函数被调用之前初始化,并且,只初始化一次 。
函数static变量在函数中有效,第一次进入函数初始化。以后进入函数将沿用上一次的值。
2、 生存期。
生存期,是main第一次执行,直到程序结束。比如下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
if(true)
{
static int m=10;
}
int c=0;
return 0;
}
尽管m变量在函数内部定义。但是它的生存期直到main函数执行完才结束。而非出了if语句的括号函数就结束。这是因为static变量不是存放在堆栈中的,而是存放在全局静态数据区中。
1、 作用域。
如果在{}中定义了static变量,则其作用域为{}内。例如上面的m变量就只能在{}内访问。如果有如下的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
if(true)
{
static int m=10;
}
int c=0;
printf("%d",m);
return 0;
}
将在printf处报错:“error C2065: 'm' : undeclared identifier”。指示该变量没有定义。
如果将static变量定义为全局的。则其拥有文件作用域:只在声明的文件中有效,其他源文件中不可见;同时有了static的生命周期。
如下:
//source.cpp
#include <stdio.h>
#include <stdlib.h>
int m=3;
int main()
{
if(true)
{
m=10;
}
int c=0;
printf("%d",m);
return 0;
}
则static变量在source.cpp文件中有效。