说我有类似的东西
void init(void){
int foo = 0;
}
void useFoo(void){
foo++;
}
void main{
init();
useFoo();
}
我们有一个初始化一个(或多个)变量的 init 函数,然后是另一个必须使用该变量的函数(或可能是多个函数),我如何使“int foo”对那些其他函数可见?
您可以使其在全局范围内可见:
int foo;
void init()
{
foo = 0;
}
void useFoo()
{
++foo;
}
您还可以将指针传递给需要的变量:
void init(int *foo)
{
*foo = 0;
}
void useFoo(int *foo)
{
(*foo)++;
}
...
int foo;
init(&foo);
useFoo(&foo);
或者您可以使用线程本地存储、文件、其他媒体,但我相信您不希望这样 :)
简短的回答是“你不能”(至少不是那样)。变量foo
ininit
在 的入口处创建init
,然后在从 的返回时销毁init
。通过调用它不再存在useFoo
。
您需要该变量具有更长的“存储持续时间”(程序级生命周期)。您可以通过使其具有“静态持续时间”(通过static
关键字并将其移出函数 - 尽管实际上将其移出就足够了)来做到这一点,在这种情况下只有一次实例(许多其他语言中的“单例” '分类法)。或者,您可以构建使用创建的数据结构malloc
,为数据提供“分配的持续时间”:它从该点持续malloc
到稍后free
(我们realloc
现在将忽略 :-))。
分配持续时间方法更麻烦但更灵活。
最简单的方法是使它成为一个全局变量:
int foo;
void init(void) {
foo = 0;
}
void useFoo(void) {
foo++;
}
void main(void) {
init();
useFoo();
}
另一种方法是使用指针:
#include <stdio.h>
void init(int *foo) {
*foo = 0;
}
void useFoo(int *foo) {
(*foo)++;
}
void main(void) {
int foo;
init(&foo);
useFoo(&foo);
useFoo(&foo);
useFoo(&foo);
printf("%d\n", foo);
}
最后一个是将它作为参考传递(当使用 CPP,而不是 C 时):
#include <stdio.h>
void init(int &foo) {
foo = 0;
}
void useFoo(int &foo) {
foo++;
}
int main(int argc, char** argv) {
int foo;
init(foo);
useFoo(foo);
useFoo(foo);
useFoo(foo);
printf("%d\n", foo);
return 0;
}