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

Posted

技术标签:

【中文标题】从 C 中的另一个文件访问全局静态变量【英文标题】:Access a global static variable from another file in C 【发布时间】:2010-12-30 16:45:34 【问题描述】:

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

在文件 a.c 中

static int val = 10;
globalvar = val;

在文件 b.c 中

extern globalvar;

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

请告诉我如何才能达到同样的效果。

谢谢, 西坎达。

【问题讨论】:

对于那些想知道为什么有人要这样做的人:我遇到了类似的情况,需要访问生成代码中的命令表,在制造商的 IDE 中为其可编程硬件进行开发。 【参考方案1】:

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

如果您可以修改a.c 但不能使val 非静态(为什么?),那么您可以在a.c 中声明一个指向它的全局指针

int *pval = &val;

b.c

extern int *pval;

这将允许您通过*pval 访问val 的当前值。或者你可以引入一个非静态函数来返回val的当前值。

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

【讨论】:

【参考方案2】:

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

/* 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

【讨论】:

【参考方案3】:

您不能访问文件外部的文件级静态变量。

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

    向具有静态变量的文件添加访问器函数。好消息是这将文件外部的访问限制为只读访问:

    int read_static() return val;

    删除静态限定符并将变量设为全局变量。

【讨论】:

几乎:您无法在该 TU(翻译单元)之外访问它。了解 TU 并实现文件级静态意味着“仅限 TU-local”是他所需要的。 @Roger - 你是绝对正确的。但我记得当我还是一个 C 程序员新手时,“翻译单元”总是让我感到困惑。【参考方案4】:

解决方案 1:

在文件 a.c 中

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

在文件 b.c 中

extern int *globalvar;

解决方案 2:

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

建议使用解决方案 2,但如果您仅限于将静态变量更改为外部变量,请使用解决方案 1。

【讨论】:

以上是关于从 C 中的另一个文件访问全局静态变量的主要内容,如果未能解决你的问题,请参考以下文章

从java中的另一个类访问静态变量

C语言全局变量(c文件和h文件中的全局变量静态全局变量)使用注意事项

C语言全局变量(c文件和h文件中的全局变量静态全局变量)使用注意事项

全局变量怎么定义

Rust无法将Singleton从全局空间导入另一个文件中的另一个模块

如何在Obj C中的另一个类中使用一个类中声明的变量