如何在不同的.c 文件之间共享变量?

关于 C 声明的初学者问题:

在.c 文件中,如何使用在另一个.c 文件中定义的变量?

151951 次浏览

如果变量是:

int foo;

在第二个 C 文件中你声明:

extern int foo;

在 fileA.c 中:

int myGlobal = 0;

在档案里

extern int myGlobal;

在文件 B.c:

#include "fileA.h"
myGlobal = 1;

原理是这样的:

  • 变量位于 fileA.c 中
  • H 告诉全世界它的存在,以及它的类型(int)
  • FileB.c 包含 fileA.h,以便编译器在 fileB.c 尝试使用 myGlobal 之前了解它。

这些其他变量必须声明为 public (使用 extern,public 是用于 C + + 的) ,并且必须包含这些变量。文件。但是,我建议创建适当的。H 文件来定义所有的变量。

例如,对于 hello.c,有一个 hello.h,hello.h 将存储变量定义。然后是另一个。C 文件,例如 world.c 文件的顶部有这段代码:

#include "hello.h"

这将允许 world.c 使用 hello.h 中定义的变量

不过情况要稍微复杂一点。您可以使用 < > 来包含在操作系统路径上找到的库文件。作为一个初学者,我会把你所有的文件放在同一个文件夹中,并使用“”语法。

第2个文件需要知道变量的存在。为此,需要再次声明变量,但是在变量前面使用关键字 extern。这告诉编译器变量是可用的,但是在其他地方声明了它,从而防止实例化它(同样,当链接时会导致冲突)。当您将 extern声明放在 C 文件本身时,通常的风格是为每个 .c文件附带一个头文件(即 .h) ,该头文件为持有 extern声明的其他文件提供函数或变量。这样可以避免复制 extern声明,特别是在多个其他文件中使用时。这同样适用于函数,尽管不需要关键字 extern

这样你至少会有三个文件: 声明变量的源文件,伴随 extern声明的头文件,以及 #include通过头文件访问导出变量(或者导出头文件中的任何其他符号)的第二个源文件。当然你需要所有的源文件(或适当的对象文件) ,当尝试链接这样的东西,因为链接器需要解析符号,这是唯一可能的,如果它实际上存在于链接的文件。

  1. 尽量避免使用全局变量。如果必须使用全局变量,请参阅其他答案。
  2. 将其作为参数传递给函数。

在99.9% 的情况下,在文件之间共享非常数的全局变量是不好的程序设计。实际上需要这样做的案例很少: 它们非常罕见,我找不到任何有效的案例。也许是硬件寄存器的声明。

在大多数情况下,您应该使用(可能是内联的) setter/getter 函数(“ public”)、文件范围内的静态变量(“ private”)或不完整的类型实现(“ private”)。

在少数情况下,如果需要在文件之间共享一个变量,可以这样做:

// file.h
extern int my_var;


// file.c
#include "file.h"
int my_var = something;


// main.c
#include "file.h"
use(my_var);

永远不要在 h 文件中放入任何形式的变量定义。