【发布时间】:2014-09-20 11:12:42
【问题描述】:
我最近遇到了一个问题,比如如何将在 file1.c 中声明为静态的变量访问到另一个 file2.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编译
如果我执行上述操作,我可以访问该变量。
所以我的问题是:
上述程序是否违反静态变量规则?
-
如果不是,为什么会这样,除了包括文件(
#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?
如果我对静态变量的概念有误以及是否有更好的解决方案可用于访问静态变量,请纠正我?
【问题讨论】:
-
您从未在 file1.c 中使用过
a。我认为如果您尝试访问它,编译器应该会抛出错误。 -
您没有违反任何规定,也没有在静态的翻译单元之外“访问”
a。您有一个按值返回a的函数。如果您需要在file2.c之外修改它,请通过函数返回其地址或提供功能性 get/set api。 -
IDK 这里的“更好”应该是什么意思,但你可以写
int *foo() { return &a; } -
@vinayhunachyal 是的,这是可能的。 32 先生给出了一种方法,而我的评论给出了另一种方法。哪个“更好”是一个见仁见智的问题
-
注意
static隐藏了名字;您不能使用该名称从定义静态变量的翻译单元 (TU) 外部访问该变量。另一个同名变量可能存在于另一个 TU 中——但这将是一个单独的变量。但静态只隐藏名称。可以传递指针以使变量可访问——它只是完全隐藏的名称。但只有定义了静态变量的 TU 中的代码才能提供对变量的访问;文件外的普通代码无法通过名称访问变量。
标签: c static static-variables internal-link