在 C 头文件中声明变量
Declaring variable in C header
我想在 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中的定义。
所以我的问题是:
这是从外部源包含一些常量变量的正确方法吗?
如果是,我做错了什么,如何解决?
谢谢
编辑:我已经用一个可以测试的例子更新了我的代码。此代码未编译,因为它表示 'b' 在函数栏中未声明。如果我注释掉 bar 中的 printf,它会编译并 运行。所以变量可以被 main 看到但不能被 foo.c?
EDIT2:以这种方式包含的变量是只读的。我更新了代码并在 foo.c 中添加了 foo.h 的包含,现在编译器告诉我 'a' 和 'b'
有多个定义
EDIT3:清理代码和试图更清楚的问题。
在头文件中声明变量并在c文件定义
是一个很好的做法
更多详情:Variable Definition vs Declaration
在你的variable.h
中,你只需定义两个变量
所以,这不是正确的方法
另外数组相关的代码没有错,可以放在一个.c
文件里
变量必须在c文件中定义,而在头文件中可以放置外部引用
/* 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};
从 foo.h
中删除 #include "variable.c"
,您的代码应该可以工作。
您基本上是在使用 extern
告诉您的编译器,无论您在 extern
关键字之后的声明中使用什么,都将在单独链接的另一个 .c 源文件中定义。在你的例子中,这个 .c 文件是 variable.c
.
是的,千万不要 #include
.c 文件。这很容易导致链接器失控。
我想在 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中的定义。
所以我的问题是:
这是从外部源包含一些常量变量的正确方法吗?
如果是,我做错了什么,如何解决?
谢谢
编辑:我已经用一个可以测试的例子更新了我的代码。此代码未编译,因为它表示 'b' 在函数栏中未声明。如果我注释掉 bar 中的 printf,它会编译并 运行。所以变量可以被 main 看到但不能被 foo.c?
EDIT2:以这种方式包含的变量是只读的。我更新了代码并在 foo.c 中添加了 foo.h 的包含,现在编译器告诉我 'a' 和 'b'
有多个定义EDIT3:清理代码和试图更清楚的问题。
在头文件中声明变量并在c文件定义
是一个很好的做法更多详情:Variable Definition vs Declaration
在你的variable.h
中,你只需定义两个变量
所以,这不是正确的方法
另外数组相关的代码没有错,可以放在一个.c
文件里
变量必须在c文件中定义,而在头文件中可以放置外部引用
/* 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};
从 foo.h
中删除 #include "variable.c"
,您的代码应该可以工作。
您基本上是在使用 extern
告诉您的编译器,无论您在 extern
关键字之后的声明中使用什么,都将在单独链接的另一个 .c 源文件中定义。在你的例子中,这个 .c 文件是 variable.c
.
是的,千万不要 #include
.c 文件。这很容易导致链接器失控。