【问题标题】:How to use a static C variable across multiple files?如何跨多个文件使用静态 C 变量?
【发布时间】:2012-10-04 13:32:59
【问题描述】:

我有两个 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”。 我该怎么做?

【问题讨论】:

  • 你不能有两个main()函数。
  • 对不起我的错误。我编辑了问题
  • 在一个 cpp 文件和另一个使用关键字 extern 中定义变量。
  • 这个问题没有任何意义。将文件范围变量声明为静态的全部意义在于防止它被其他文件访问。你应该问自己的是“为什么我在我的代码中使用静态,而我不知道关键字的含义”
  • 您可以使用 extern 代替 static。

标签: c file gcc static


【解决方案1】:

选择一个将存储变量的文件。不要使用staticstatic 的全部意义在于保持变量私有且其他模块无法触及。

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

extern int i;

【讨论】:

  • 如果我删除静态,它将是一个全局变量。它不再是静态的。
  • 静态变量不能从其编译单元外部引用。你需要一个全局变量。
  • 做你想做的事的唯一方法是一个全局变量。这就是 global 的重点:每个模块都是一样的。
  • @SurjyaNarayanaPadhi:没有静态和全局是正交的。您只是不能跨文件使用static 变量。
  • 不能跨文件使用静态变量。请注意,当应用于 C 变量时,“静态”意味着与 C++ 或 Java 静态成员变量完全不同的东西。
【解决方案2】:

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

全局变量

int i;

优点:

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

缺点:

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

本地/私有变量

static int i;

优点:

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

缺点:

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

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

【讨论】:

  • > "永远没有理由访问另一个文件中的静态变量" 有:将模块拆分到不同的文件中。
【解决方案3】:

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

【讨论】:

  • 我尝试在文件 1.c 中使用 extern 关键字。但它抛出编译错误。它不识别外部变量“i”
【解决方案4】:

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

在 2.c 中

static int i;
int *globalvar = &i;

在 1.c 中

extern int *globalvar;

【讨论】:

  • 这很有帮助,我在面试中多次遇到这个问题,现在我知道了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多