C 将静态变量从一个文件访问到另一个文件
我最近遇到了一个问题,比如如何将file1.c中声明为static的变量访问到另一个file2.c 可以访问静态变量吗 我对C中静态关键字的理解是C 将静态变量从一个文件访问到另一个文件,c,static,static-variables,internal-link,C,Static,Static Variables,Internal Link,我最近遇到了一个问题,比如如何将file1.c中声明为static的变量访问到另一个file2.c 可以访问静态变量吗 我对C中静态关键字的理解是 static是“内部链接”,因此只能从一个编译单元(定义它们的单元)访问它们。使用内部链接声明的对象对于单个模块是私有的 正如我的一位朋友在下面建议我的解决方案 在file1.c中 #include <stdio.h> int main() { int b=foo(); prin
static
是“内部链接”,因此只能从一个编译单元(定义它们的单元)访问它们。使用内部链接声明的对象对于单个模块是私有的
正如我的一位朋友在下面建议我的解决方案
在file1.c中
#include <stdio.h>
int main()
{
int b=foo();
printf("%d",b);
return 0;
}
由gcc file1.c file2.c-o文件编译
如果我执行上述操作,我可以访问变量
因此,我的问题是:
#include
)之外,还有其他方法访问静态变量吗
当
静态int a=25时代码>变量a
将具有内部链接;这意味着链接器无法看到a
文件2.c
之外的任何地方
当你在file2.c
中调用foo()
时,你会得到一份a
,这是你打印的副本;但这并不意味着您可以访问file2.c
中定义的实际a
,当您需要在不同的TU中可以看到相同变量时,您可以这样做
定义文件
该文件声明并定义变量;此外,还将其初始化为1,没有该值,它将默认初始化为0
// (non-static) global variable with external linkage and thus visible across TUs
int var_across = 0;
void use()
{
var_across = 1;
}
使用文件
1)上述程序是否违反了静态变量规则?
不,你没有遵守任何规则。在这里,foo函数创建该静态变量值的副本,并在其他文件中使用。很好
2)如果不是,为什么会这样?除了包含文件(#include)之外,还有其他方法访问静态变量吗?不像这样,我怎样才能从另一个文件访问静态变量?
静态变量只能在该文件中使用
不能使用该变量使它们在其他文件中成为外部变量
另一个棘手的问题是获取该静态变量的指针,并将其作为全局指针,并将其作为另一个文件中的extern,您可以使用该静态变量
文件1.c
#include<stdio.h>
static int a=25;
int* ptr = &a;
#包括
静态INTA=25;
int*ptr=&a;
文件2.c
#include<stdio.h>
extern int *ptr;
int main()
{
printf("%d",*ptr);
return 0;
}
#包括
外部内部*ptr;
int main()
{
printf(“%d”,*ptr);
返回0;
}
如果我对静态变量概念有错误,并且有更好的解决方案,请纠正我?
通过将全局变量设为静态变量。在C中我们通常称之为变量的实际上是两件事:一个对象,分配给变量的内存,用某种类型解释;一个标识符,访问该对象的一种方法 从另一个编译单元访问
静态
对象或其值没有问题。您的函数foo
将值提升到另一个单位,这很好,但它甚至可以毫无问题地提升a
的地址
具有内部链接只涉及标识符,即名称
a
。只有在file2.c
中将静态变量的地址分配给指针时,才会使静态变量对子文件可用
在子文件中,我们必须对指针使用extern关键字
但没有必要这样做 使用static关键字,我需要访问-1使extern int a您无法访问file1.c.@Mr.32中的static int a。请正确阅读答案。我说,
a
将具有内部链接,因此链接器无法看到它,这意味着相同。此外,我还编写了删除静态
将使其与外部
一起工作。这个答案与所使用的OPextern inta
在file1.c
中。您应该更新您的答案,澄清“我已经编写了删除静态将使其与外部工作”,以便我可以向上投票you@Mr.32同意,我明白了。现在修复它以匹配更改的问题。您从未在file1.c中使用过a
。我认为,如果您试图访问它,编译器应该抛出错误。您没有违反任何规定,也没有在翻译单元(它是静态的)之外“访问”a
。您有一个按值返回a
的函数。如果您需要在file2.c
之外对其进行修改,或者通过函数返回其地址,或者提供函数get/set api.IDK这里“更好”的含义是什么,但是您可以编写int*foo(){return&a;}
@vinayhunachyal是的,这是可能的。32先生给出了一种方法,我的评论给出了另一种方法。这是一个意见的问题,哪一个是“更好的”注意,static
隐藏了名称;不能使用该名称从定义静态变量的转换单元(TU)外部访问该变量。另一个TU中可能存在另一个同名变量,但这将是一个单独的变量。但是static只隐藏名称。指针可以被传递,以使变量
#include<stdio.h>
static int a=25;
int* ptr = &a;
#include<stdio.h>
extern int *ptr;
int main()
{
printf("%d",*ptr);
return 0;
}