我想在C中包含一个在外部文件中声明的变量。
我的项目结构如下所示。
foo.h
foo.c
variable.c
main.c
我现在正在做的是
/ * main.c * /
#include "foo.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
bar();
printf("%d\n", a);
return 0;
}
/ * foo.h * /
#ifndef FOO_H
#define FOO_H
#include "variable.c"
extern const int a;
extern const int b[];
int bar();
#endif
/ * foo.c * /
#include "foo.h"
#include <stdio.h>
int bar () {
printf("tururu\n");
printf("%d\n", b[0]);
return 0;
}
/ * variable.c * /
const int a = 2;
const int b[3] = {1, 2, 3};
我想用这种方式定义的变量是常量(只读)。
我事先不知道数组的大小,它取决于variable.c中的定义。
所以我的问题是:
这是从外部来源包含一些常量变量的正确方法吗?
如果是的话,我做错了什么以及如何解决?
谢谢
编辑:我已经用可以测试的示例更新了我的代码。此代码未编译,因为它表示&#39; b&#39;在功能栏中未声明。如果我在栏中注释掉printf,它会编译并运行。所以变量可以通过main看到,但不能通过foo.c看到?
EDIT2:这种方式包含的变量是只读的。我已经更新了代码并在foo.c中添加了foo.h的包含,现在编译器告诉我们有多个定义了&#39; a&#39;和&#39; b&#39;
EDIT3:清理代码和试图更清晰的问题。
答案 0 :(得分:2)
必须在c文件中定义变量,而在标题中可以放置extern引用
/* foo.h */
#ifndef FOO_H
#define FOO_H
#include "variable.h"
extern int a;
extern int b[];
#endif
/* foo.c */
int a = 2;
int b[3] = {1, 2, 3};
答案 1 :(得分:2)
从#include "variable.c"
移除foo.h
,您的代码应该有效。
您基本上使用extern
告诉您的编译器,在extern
关键字之后的声明中使用的任何内容都将在另一个单独链接的.c源文件中定义。在您的情况下,此.c文件为variable.c
。
是的,请注意永远不要#include
.c文件。这很容易导致链接器变得混乱。
答案 2 :(得分:1)
最好在头文件中声明变量,在c文件中定义
更多细节:Variable Definition vs Declaration
在variable.h
中,您只需定义两个变量
所以,这不是正确的方式
除了与数组相关的代码没有错,你可以把它放在.c
文件中