关于C声明的初学者问题:
在.c文件中,如何使用另一个.c文件中定义的变量?
答案 0 :(得分:119)
在fileA.c中:
int myGlobal = 0;
在fileA.h中
extern int myGlobal;
在fileB.c中:
#include "fileA.h"
myGlobal = 1;
这就是它的工作原理:
int
)答案 1 :(得分:10)
如果变量是:
int foo;
在您声明的第二个C文件中:
extern int foo;
答案 2 :(得分:9)
答案 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
标题获取访问权限的第二个源文件导出的变量(或标题中导出的任何其他符号)。当然,在尝试链接类似的东西时,您需要所有源文件(或相应的目标文件),因为链接器需要解析符号,只有当它实际存在于链接的文件中时才可能。