-1

说我有类似的东西

void init(void){
    int foo = 0;
}
void useFoo(void){
    foo++;
}
void main{
    init();
    useFoo();
}

我们有一个初始化一个(或多个)变量的 init 函数,然后是另一个必须使用该变量的函数(或可能是多个函数),我如何使“int foo”对那些其他函数可见?

4

3 回答 3

2

您可以使其在全局范围内可见:

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);

或者您可以使用线程本地存储、文件、其他媒体,但我相信您不希望这样 :)

于 2013-03-16T19:31:21.143 回答
1

简短的回答是“你不能”(至少不是那样)。变量fooininit在 的入口处创建init,然后在从 的返回时销毁init。通过调用它不再存在useFoo

您需要该变量具有更长的“存储持续时间”(程序级生命周期)。您可以通过使其具有“静态持续时间”(通过static关键字并将其移出函数 - 尽管实际上将其移出就足够了)来做到这一点,在这种情况下只有一次实例(许多其他语言中的“单例” '分类法)。或者,您可以构建使用创建的数据结构malloc,为数据提供“分配的持续时间”:它从该点持续malloc到稍后free(我们realloc现在将忽略 :-))。

分配持续时间方法更麻烦但更灵活。

于 2013-03-16T19:36:12.973 回答
0

最简单的方法是使它成为一个全局变量:

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;
}
于 2013-03-16T19:37:08.380 回答