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


How do I share variables between different .c files?

本问题已经有最佳答案,请猛点这里访问。

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

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


C:

1
int myGlobal = 0;

在菲律宾

1
extern int myGlobal;

在Fielb C中:

1
2
#include"fileA.h"
myGlobal = 1;

这就是它的工作原理:

  • 变量存在于filea.c中
  • fila.h告诉世界它存在,它的类型是什么(int)
  • fileb.c包含filea.h,以便编译器在fileb.c尝试使用它之前了解myglobal。


如果变量为:

1
int foo;

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

1
extern int foo;


  • 尽量避免全球性的。如果必须使用全局变量,请参阅其他答案。
  • 将它作为参数传递给函数。

  • 99.9%的情况下,在文件之间共享非常量全局变量是不好的程序设计。当你真正需要这样做的时候,很少有案例:它们是如此的罕见,以至于我无法想出任何有效的案例。硬件寄存器的声明。

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // file.h
    extern int my_var;

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

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

    不要将任何形式的变量定义放在H文件中。


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

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

    1
    #include"hello.h"

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

    但比这要复杂一点。您可以使用<>包含在操作系统路径上找到的库文件。作为初学者,我将把您的所有文件都放在同一个文件夹中,并使用""语法。


    第二个文件需要知道变量的存在。为此,您再次声明变量,但在变量前面使用关键字extern。这会告诉编译器变量是可用的,但在其他地方声明,从而防止声明它(同样,链接时会引起冲突)。虽然您可以将extern声明放在c文件本身中,但对于每个.c文件,通常都有一个附带的头文件(即.h文件),它为其他保存extern声明的文件提供函数或变量。这样可以避免复制extern声明,尤其是在多个其他文件中使用时。这同样适用于函数,尽管您不需要关键字extern来表示它们。

    这样,您至少可以有三个文件:声明变量的源文件、执行extern声明的压缩头文件和#include作为头文件访问导出变量(或头中导出的任何其他符号)的第二个源文件。当然,当试图链接类似的内容时,您需要所有源文件(或适当的对象文件),因为链接器需要解析符号,只有当符号实际存在于链接的文件中时,才可能解析符号。