我怎么能从另一个文件访问静态变量?

aks*_*aks 0 c static-variables

我怎么能从另一个文件访问静态变量?静态变量不具有文件范围吗?

bash-3.2$ ls
a.c  b.c

bash-3.2$ cat a.c
#include <stdio.h>
static int s = 100;
int fn()
{
/*  some code */
}

bash-3.2$ cat b.c
#include <stdio.h>
#include "a.c"
extern int s;
int main()
{
printf("s = %d \n",s);
return 0;
}

bash-3.2$ gcc b.c   

bash-3.2$ a.exe
s = 100 
Run Code Online (Sandbox Code Playgroud)

qrd*_*rdl 6

你已将一个文件包含在另一个文件中 - 非常糟糕的做法 但从C编译器点,这两个文件形成一个翻译单元,因为C预处理插入的内容a.cb.c.

如果有两个单独的翻译单元,一个单元不能访问static另一个单元,但不是你的情况.

如果您删除#include "a.c"行并编译它应该是:gcc a.c b.c,您将收到unresolved external错误s.

  • @Jonathan:由于对尚未掌握TU概念的初学者的困惑,非常专业,不值得一提.一般规则"从不包含实现(*.c)文件作为标题"也包含在内,因为您不会将它们视为标题. (2认同)

CB *_*ley 5

这是从一个单独的文件,但你要打印不是来自一个单独的翻译单位,你#include整个的a.cb.c.

static对象是翻译单元的本地对象,它由所有包含的文件组成,而不是单个源文件.

  • #include与"import"或其他语言支持的类似不同.它更像是通过剪切和粘贴以及"标题"文件来组装单个源文件.这与将多个编译单元链接在一起并不相同 - 为此,您使用链接器将编译器生成的目标文件与源文件组合在一起.单源文件的情况通常变得简单 - 两个+文件并不难,但你需要知道编译器选项等,或找到一个为你做这个的IDE. (2认同)