我有2个文件:Sod/iload/iload.c
和
Item/itemrule/itemrule.c
,我想访问在item.rule.c中定义的iload.c中定义的变量。
为此,我在iload.c中创建并定义了一个全局变量,然后尝试使用extern关键字在itemrule .c中访问此变量,但该变量始终为0。
我担心这可能是因为文件具有不同的路径,有人知道我如何访问此变量?
答案 0 :(得分:2)
通常的习惯用法是在头文件中使用extern
声明,并在需要全局的地方包括该声明。
// foo.h
// Make the global visible in any C file that includes this header.
extern int my_global_var;
// foo.c
#include "foo.h" // Not really needed here, but fine.
int my_global_var;
...
// bar.c
#include <stdio.h>
#include "foo.h" // This one makes the global visible in the rest of the file.
void do_something(void) {
printf("my global var's value is: %d\n", my_global_var);
}
请注意,在任何大小或复杂性很高的程序中使用此类全局变量都可能导致凌乱,易错和难以更改的代码。不是一个很好的模式。
答案 1 :(得分:0)
我想为吉恩(Gene)的答案提供替代方案。以我的经验,共有两种主要方法跨模块(编译单元)共享变量:
1)“字母和二传手”。
2)外部。
根据与您合作的团队的类型,他们会优先选择一个或另一个。默认情况下,C函数具有外部链接;如果您不希望这样做,则需要通过函数名称前面的 static 关键字强制进行内部链接。
1)Getter和Setters:
// foo.c
#include <stdio.h>
int my_global_var = 0;
...
然后,您可以使用外部链接的吸气剂和吸气剂。即:
int get_my_global_var(void)
{
return my_global_var;
}
void set_my_global_var(int var)
{
my_global_var = var;
}
这是在c文件(模块)内完成。它将可以从任何其他模块调用getter和setter,他们将获取并设置全局变量my_global_var
。
2)外部:
// foo.c
#include <stdio.h>
int my_global_var = 0;
...
getter和setter的替代方法是使用externs。在这种情况下,您无需向包含要访问/修改的全局变量(my_global_var
)的模块添加任何额外内容。
// bar.c
#include <stdio.h>
extern int my_global_var;
...
请注意此处的语法;使用 extern 关键字时,我们不会将其初始化为任何东西。我们只是在通知编译器全局变量my_global_var
具有外部链接。