在C中,假设var1是foo1()中的变量,而foo2()想要访问var1,但foo1()不会调用foo2(),所以我们不能通过参数传递它。同时,只有foo1()和foo2()才能访问它,所以我不想将它声明为全局变量。它将与朋友的语义相似[&34;在c ++中,有没有办法在C中实现它?
void foo1() {
...
var1;
....
}
void foo2() {
...
how to access var1?
...
}
答案 0 :(得分:4)
将变量传递给两个函数....一般函数不应该保持状态。
很快就会发现传递变量不是很好而且变得脆弱,所以相反,你传递结构....然后函数开始处理结构状态。
typedef struct
{
int var1;
} blah_t;
void foo1(blah_t* b)
{
b->var1=0;
}
void foo2(blah_t* b)
{
b->var1++;
}
这是做OO C背后非常简单的种子理念。
答案 1 :(得分:2)
您需要在函数范围之外声明var1
,然后将其作为参数发送给两者。或者,将其声明为全局变量。
答案 2 :(得分:1)
通过引用是一种方式:(在此示例中,i
的内存是caller()
的本地内容)
void caller()
{
int i = 5;
foo(&i);
bar(&i);
printf("\n final i is %d",i);
}
void foo(int *i)
{
printf("%d",*i);
*i += 5;
}
void bar (int *i)
{
printf("%d",*i);
*i += 5;
}
全球:(通常认为可怕i
的名称更像GLOBAL_I
或其他内容)
int i = 0;
void caller()
{
i=5;
foo();
bar();
printf("\n final i is %d",i);
}
void foo()
{
printf("%d",i);
i += 5;
}
void bar (int i)
{
printf("%d",i);
i += 5;
}
答案 3 :(得分:0)
没有。变量仅在foo1()
运行时存在于函数堆栈中。离开功能时堆栈将消失。您可以将变量设置为静态以使其保持活动状态,但是如果没有黑客攻击,则无法从外部访问它。
答案 4 :(得分:0)
关于 与c ++中的“朋友语义”相似。 C不具备相同的能力 您还说: 因此我们无法通过参数传递
C 的唯一其他选项,用于从函数到函数访问变量而不作为函数参数传递,是使用某种类型的全局范围变量。 /> 以下具体说明当函数位于单独的.c模块中时如何执行此操作。
对于案例 ,其中void foo1()
和void foo2()
存在于不同的C模块中...
但是您仍然希望能够访问同一个变量,并确保其值在项目的所有位置始终相同,然后考虑使用extern scope
。
两个模块共有一个标题文件 ,您可以拥有全局的 项目范围 版本
的 file.h 强> 的
void foo1(void);
void foo2(void);
extern int var1;
的 file1.c中强> 的
#include "file.h"
int var1 = 5;
int main(void)
{
printf("value of var1 is %d\n", var1);//original value of var1
foo1();
printf("value of var1 is %d\n", var1);//var1 modified by foo1()
foo2();
printf("value of var1 is %d\n", var1);//var1 modified by foo2()
return 0;
}
void foo1(void)
{
var1 = 15;
}
的 file2.c中强> 的
#include "file.h"
void foo2(void)
{
var1 = 20;
}
答案 5 :(得分:0)
这个答案的灵感来自许多其他语言中的“模块”概念,可以使用gcc的嵌套函数进行近似。变量var1
在foo1()
和foo2()
的范围内,但不在其他所有范围内。该解决方案既不使用全局变量也不使用参数。
void foo(int fn)
{
static int var1;
void fn1(void)
{
var1 = 15;
}
void fn2(void)
{
var1 = 20;
}
(fn == 1)? fn1(): fn2();
printf("Value of var1 is now %d\n", var1);
}
void foo1(void){foo(1);}
void foo2(void){foo(2);}
int main (void)
{
foo1();
// Expected stdout: Value of var1 is now 15
foo2();
// Expected stdout: Value of var1 is now 20
}