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

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

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

在fileA.c中:

int myGlobal = 0; 

在fileA.h中

 extern int myGlobal; 

在fileB.c中:

 #include "fileA.h" myGlobal = 1; 

所以这是如何工作的:

  • 该variables居住在fileA.c中
  • fileA.h告诉世界它存在,它的types是什么( int
  • fileB.c包含fileA.h,以便在fileB.c尝试使用它之前,编译器知道myGlobal。
  1. 尽量避免全局。 如果您必须使用全局,请参阅其他答案。
  2. 把它作为一个parameter passing给一个函数。

如果variables是:

 int foo; 

在第二个C文件中声明:

 extern int foo; 

在99.9%的情况下,在文件之间共享非常量的全局variables是不好的程序devise。 很less有这样的情况,你真的需要这样做:他们非常罕见,我不能提出任何有效的案例。 也许是硬件寄存器的声明。

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

在less数情况下,当你需要在文件之间共享一个variables时,可以这样做:

 // file.h extern int my_var; // file.c #include "file.h" int my_var = something; // main.c #include "file.h" use(my_var); 

切勿将任何forms的variables定义放在h文件中。

那些其他的variables必须公开声明(使用extern,public是C ++),你将不得不包含.c文件。 但是,我build议创build适当的.h文件来定义所有的variables。

例如,对于hello.c,你将有一个hello.h,而hello.h将存储你的variables定义。 然后另一个.c文件,比如world.c将会在顶部有这段代码:

 #include "hello.h" 

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

比这个稍微复杂一些。 您可以使用<>来包含在您的操作系统path中find的库文件。 作为一个初学者,我会把所有的文件都放在同一个文件夹中,并使用“”语法。

第二个文件需要知道你的variables的存在。 要做到这一点,你再次声明variables,但在它的前面使用关键字extern 。 这告诉编译器该variables是可用的,但在其他地方声明,从而防止instanciating它(再次,这将导致连接冲突)。 虽然可以extern声明放在C文件本身中,但是为每个.c文件提供一个伴随的头文件(即.h )文件是常见的风格,这个文件为其他持有extern声明的函数或variables提供了函数或variables。 这样可以避免复制extern声明,特别是在多个其他文件中使用时。 这同样适用于函数,虽然你不需要关键字extern

这样,至less有三个文件:声明variables的源文件,执行extern声明的acompanying头文件和包含头文件的第二个源文件,以获得对导出variables(或导出的任何其他符号在标题中)。 当然你需要所有的源文件(或适当的目标文件),因为链接器需要parsing符号,只有链接文件中存在的符号才可能。