我最近遇到过如何访问一个在file1.c中声明为static的变量到另一个file2.c的问题?
是否可以访问静态变量?
我对C中静态关键字的理解是,
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
编译
如果我这样做,我可以访问该变量。
所以我的问题是:
上述程序是否违反了静态变量规则?
如果没有,为什么会这样,除了包含文件(#include <…>
)之外,还有其他任何方法可以访问静态变量。
How am I able to access a static variable from another file?
In C, how do I restrict the scope of a global variable to the file in which it's declared?
如果我对静态变量概念出错并且是否有更好的解决方案可用于访问静态变量,请纠正我?
答案 0 :(得分:7)
1)上述程序是否违反了静态变量规则?
不,你不会违反任何规则。这里foo函数创建该静态变量的值的副本并在其他文件中使用。很好。
2)如果不是为什么会这样,除了包括文件(#include&lt;&gt;)之外还有其他方法可以访问静态变量吗?不是这样我怎样才能从另一个文件访问静态变量吗
静态变量仅表示在该文件中使用。
您无法使用该变量将其外部用于其他文件。
另一个肮脏的黑客是获取该静态变量的指针并将其作为全局指针并将其作为另一个文件中的extern使用该静态变量。
file1.c中
#include<stdio.h>
static int a=25;
int* ptr = &a;
file2.c中
#include<stdio.h>
extern int *ptr;
int main()
{
printf("%d",*ptr);
return 0;
}
如果我对静态变量概念有误并且有更好的解决方案可用,请纠正我吗?
静态变量的生命周期延伸到整个程序运行
如果不使用某个值初始化静态变量,则其默认值为0。
静态变量的范围仅限于其文件。您无法通过其他文件中的名称访问它。
你有temp1.c和temp2.c都被编译在一起然后你也可以在两个文件中都有相同名称的静态变量 - 它们是单独的变量。
在C中,如何将全局变量的范围限制为声明它的文件?
将该全局变量设为静态。
答案 1 :(得分:4)
我们通常称之为C中的变量实际上是两件事:一个对象,为用某种类型解释的变量分配的内存,以及一个标识符,一个访问该对象的方法。
从另一个编译单元访问static
对象或其值没有问题。您的函数foo
会将值提升到另一个单位,这很好,但它甚至可以毫无问题地提升a
的地址。
内部链接仅涉及标识符,名称a
。这个只在file2.c
内可见。
答案 2 :(得分:0)
static int a=25;
变量a
将具有内部链接;意味着链接器无法在a
TU之外的任何位置看到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;
}
答案 3 :(得分:0)
将静态变量的地址分配给指针将使子文件可以使用静态变量。
在子文件中,我们必须对指针使用extern关键字。
但没有必要这样做。