8

我有两个 C 文件 1.c 和 2.c

2.c

#include<stdio.h>

static int i;

int func1(){
   i = 5;
   printf("\nfile2 : %d\n",i);
   return 0;
}

1.c

#include<stdio.h>

int i;

int main()
{
   func1();
   printf("\nFile1: %d\n",i);
   return 0;
}

我用“gcc 1.c 2.c -o st”编译了这两个文件,输出如下

file2 : 5

File2: 0

我期待输出如下

file2 : 5

File2: 5

我想在两个文件中访问相同的变量“i”。我该怎么做?

4

4 回答 4

15

选择一个将存储变量的文件。不要使用static. 的全部要点static是保持变量私有并且其他模块无法触及。

在所有其他文件中,使用extern关键字来引用变量:

extern int i;
于 2012-10-04T13:34:10.490 回答
6

永远没有理由访问另一个文件中的静态变量。您似乎不知道为什么要使用 static 关键字。有两种方法可以在文件范围(外部函数)声明变量。

全局变量

int i;

好处:

  • 在整个程序执行过程中都有效。

缺点:

  • 可以使用extern访问以创建意大利面条代码。
  • “污染”全局命名空间。
  • 不是线程安全的。
  • 在程序启动时初始化,这会产生程序开销。

本地/私有变量

static int i;

好处:

  • 在整个程序执行过程中都有效。
  • 只能由同一“模块”/“翻译单元”(同一 .c 文件)中的文件访问。
  • 提供私有封装,因为调用者无法访问它。

缺点:

  • 不是线程安全的。
  • 在程序启动时初始化,这会产生程序开销。

我个人的看法是,没有理由使用全局变量或 extern 关键字。我已经编程了 15 年以上,从来不需要使用任何一个。我已经编写了从实时嵌入式系统到 Windows GUI 绒毛应用程序的所有程序,而且我从来不需要在任何形式的应用程序中使用全局变量。此外,几乎所有已知的 C 编码标准都禁止使用它们。

于 2012-10-04T14:05:09.250 回答
1

static变量只能在单个翻译单元中访问,这意味着只有定义它的文件中的代码才能看到它。维基百科文章有一个很好的解释。在这种情况下,要跨多个文件共享变量,您将使用extern.

于 2012-10-04T13:40:29.123 回答
0

不推荐,但我们可以使用带有外部存储类的指针来实现。

在 2.c

static int i;
int *globalvar = &i;

在 1.c

extern int *globalvar;
于 2018-02-13T06:18:52.440 回答