从C中的另一个文件访问全局静态变量

时间:2009-12-29 06:09:43

标签: c global static-variables

在C语言中,我想访问文件范围之外的全局静态变量。让我知道最好的方法。 其中一种方法是为外部全局变量分配静态变量的值

在文件a.c

static int val = 10;
globalvar = val;

在文件b.c

extern globalvar;

但在这种情况下,val(文件a.c)中的任何更改都不会在(文件b.c)中的globalvar中更新。

请让我知道如何实现同样目标。

谢谢, Sikandar。

4 个答案:

答案 0 :(得分:17)

好吧,如果您可以修改文件a.c,那么只需使val非静态。

如果你可以修改a.c但不能使val非静态(为什么?),那么你可以在a.c

中声明一个指向它的全局指针
int *pval = &val;

并在b.c执行

extern int *pval;

可让您访问val*pval的当前值。或者您可以引入一个非静态函数,它将返回val的当前值。

但同样,如果您需要从其他翻译单元访问它,只需将其设置为非静态。

答案 1 :(得分:9)

您可以将全局变量指针指向全局静态变量。

/* file  a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/


/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/

int main()
{
        printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
        return 0;
}

跑步时:

$ gcc *.c && ./a.out
100

答案 2 :(得分:5)

您无法访问文件外的文件级静态变量。

如果你真的需要这样做,你有几个选择。

  1. 向具有静态变量的文件添加访问器函数。好处是这限制了从文件外部访问只读访问:

    int read_static(){return val; }

  2. 删除静态限定符并使变量成为全局变量。

答案 3 :(得分:2)

解决方案1:

在文件a.c

static int val=10;
int *globalvar =&val;

在文件b.c

extern int *globalvar;

解决方案2:

不要让另一个变量传递静态变量的地址,从而增加几个内存字节的浪费,而是将静态变量本身设为extern。

建议使用解决方案2,但如果您只能将静态变量更改为extern,请使用解决方案1.