静态变量从一个文件到另一个文件的访问
-
20-12-2019 - |
题
我最近遇到了一个问题,比如如何访问在file1中声明为static的变量。c到另一个文件2。c?
是否可以访问静态变量?
我对c中的static关键字的理解是,
static
是"内部链接",因此它们只能从一个编译单元访问-定义它们的编译单元。使用内部链接声明的对象对单个模块是私有的。
正如我的一个朋友建议我下面的解决方案。
在 file1.c
#include <stdio.h>
int main()
{
int b=foo();
printf("%d",b);
return 0;
}
在 file2.c
static int a=25;
int foo()
{
return a;
}
编译者 gcc file1.c file2.c -o file
如果我这样做,我可以访问变量。
所以我的问题是:
上述程序是否违反静态变量规则?
如果没有,为什么会这样,除了包括file(
#include <…>
)不是这样的。纠正我,如果我错了静态变量的概念,如果有任何更好的解决方案可用于访问静态变量?
解决方案
1)上面的程序是否违反了静态变量规则?
不,您没有违反任何规则。这里 foo 函数创建该静态变量值的副本并在其他文件中使用。没关系。
2)如果不是,为什么会这样,除了包含文件(#include<>)之外,还有其他方法可以访问静态变量吗?我如何能够从另一个文件访问静态变量?
静态变量仅意味着仅在该文件中使用。
您不能使用该变量使它们成为其他文件中的外部变量。
另一个肮脏的黑客是获取该静态变量的指针,并将其作为全局指针,并在另一个文件中将其作为外部指针,您可以使用该静态变量。
文件1.c
#include<stdio.h>
static int a=25;
int* ptr = &a;
文件2.c
#include<stdio.h>
extern int *ptr;
int main()
{
printf("%d",*ptr);
return 0;
}
如果我对静态变量概念有误,请纠正我,是否有更好的解决方案可用?
静态变量的生命周期延伸到程序的整个运行过程中
如果不使用某个值初始化静态变量,则其默认值将为 0。
静态变量的范围仅限于其文件。您无法通过其他文件的名称访问它。
你有 temp1.c 和 temp2.c 都被编译在一起,那么你也可以在两个文件中拥有相同名称的静态变量 - 并且它们是单独的变量。
在 C 中,如何将全局变量的范围限制在声明它的文件中?
通过将该全局变量设为静态。
其他提示
我们在C中通常所说的变量实际上是两件事:一个 对象, ,为用某种类型解释的变量分配的内存,以及 标识符, ,访问该对象的一种方式。
访问a没有问题 static
对象 或其来自另一编译单元的值。您的功能 foo
将值提升到另一个单位,这很好,但它甚至可以提升 a
没有问题。
具有内部链接只涉及标识符,名称 a
.这个只在里面可见 file2.c
.
与 static int a=25;
变量 a
会有内部联动;意思是链接器看不到 a
外的任何地方 file2.c
涂.
当你打电话的时候 foo()
在 file2.c
, ,你得到一份 a
, ,这是你打印的副本;但这并不意味着你可以访问实际的 a
定义于 file2.c
当您需要这样的访问,其中相同的变量在不同的Tu中可见时,您可以这样做
定义文件
这个文件既声明又定义了变量;另外也将其初始化为1,否则它将默认初始化为0。
// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
var_across = 1;
}
使用文件
// just a declaration to tell that it's defined elsewhere; not a definition
extern int var_across;
void use_here()
{
var_across = 2;
}
将静态变量的地址分配给指针将使子文件可用静态变量。
在子文件中,我们必须使用extern关键字到指针。
但没有必要这样做。