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

时间:2009-06-25 18:29:46

标签: c

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

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

6 个答案:

答案 0 :(得分:119)

在fileA.c中:

int myGlobal = 0;

在fileA.h中

extern int myGlobal;

在fileB.c中:

#include "fileA.h"
myGlobal = 1;

这就是它的工作原理:

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

答案 1 :(得分:10)

如果变量是:

int foo;

在您声明的第二个C文件中:

extern int foo;

答案 2 :(得分:9)

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

答案 3 :(得分:6)

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

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

在极少数情况下,当您需要在文件之间共享变量时,请执行以下操作:

// file.h
extern int my_var;

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

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

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

答案 4 :(得分:3)

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

例如,对于hello.c,您将拥有一个hello.h,而hello.h将存储您的变量定义。然后另一个.c文件,例如world.c,会在顶部显示这段代码:

#include "hello.h"

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

虽然稍微复杂一点。你可以使用< >包括在操作系统路径中找到的库文件。作为初学者,我会将所有文件都放在同一个文件夹中并使用“”语法。

答案 5 :(得分:2)

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

这样你至少会有三个文件:声明变量的源文件,执行extern声明的伴随标头和#include标题获取访问权限的第二个源文件导出的变量(或标题中导出的任何其他符号)。当然,在尝试链接类似的东西时,您需要所有源文件(或相应的目标文件),因为链接器需要解析符号,只有当它实际存在于链接的文件中时才可能。