如何在多个文件中使用静态C变量?

时间:2012-10-04 13:33:00

标签: c file gcc static

我有两个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 个答案:

答案 0 :(得分:11)

选择一个存储变量的文件。不要使用staticstatic的重点是保持变量的私密性和其他模块不可触及。

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

extern int i;

答案 1 :(得分:6)

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

全局变量

int i;

优点:

  • 在整个程序执行期间有效。

缺点:

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

本地/私人变量

static int i;

优点:

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

缺点:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

在2.c

static int i;
int *globalvar = &i;

在1.c

extern int *globalvar;