再来看一段代码:
#include
static int a;
void foo(void)
{
++a;
printf("%d\n", a);
}
int main(void)
{
foo();
foo();
foo();
}
第一个候选者:输出1,2,3.
你:好,为什么?
候选者:因为a是静态变量,会被初始化为0.
你:我同意……
候选者:cool…
这段代码呢:
#include
int a;
void foo(void)
{
++a;
printf("%d\n", a);
}
int main(void)
{
foo();
foo();
foo();
}
第一个候选者:垃圾,垃圾,垃圾。
你:你为什么这么想?
候选者:难道它还会被初始化为0?
你:是的。
候选者:那他可能输出1,2,3?
你:是的。你知道这段代码跟前面那段代码的区别吗? 有static那一段。
候选者:不太确定。等等,他们的区别在于私有变量(private variables)和公有变量(public variables).
你:恩,差不多。
第二个候选者:它将打印1,2,3.变量还是静态分配,并且被初始化为0.和前面的区别:嗯。这和链接器(linker)有关。这里的变量可以被其他的编译单元访问,也就是说,链接器可以让其他的目标文件访问这个变量。但是如果加了static,那么这个变量就变成该编译单元的局部变量了,其他编译单元不可以通过链接器访问到该变量。
你:不错。接下来,将展示一些很不错的玩意。静候:)
摘自 Rockics的专栏