说我有类似的内容
void init(void){
int foo = 0;
}
void useFoo(void){
foo++;
}
void main{
init();
useFoo();
}
我们有一个初始化一个(或多个)变量的init函数,然后是另一个必须使用该变量的函数(或者可能是多个函数),如何使“int foo”对其他函数可见?
答案 0 :(得分: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);
或者你可以使用线程本地存储,文件,其他媒体,但我相信你不希望这样:)
答案 1 :(得分:1)
简短的回答是“你不能”(至少不是这样)。 foo
中的变量init
是在init
的条目处创建的,然后在从init
返回时被销毁。调用useFoo
已不再存在。
您需要变量具有更长的“存储持续时间”(程序级生命周期)。您可以通过使其具有“静态持续时间”(通过static
关键字并将其移出函数外部来实现这一点 - 尽管实际上,移出它就足够了),在这种情况下只有一次实例(“单身” “在许多其他语言的分类法中。或者,您可以构建使用malloc
创建的数据结构,为数据提供“已分配的持续时间”:它从malloc
开始持续到free
之后(我们将会暂时忽略realloc
:-))。
分配持续时间方法更麻烦但更灵活。
答案 2 :(得分: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;
}