如果我有两个源文件和一个标题:file1.c,file2.c和header.h,并且:
- header.h -
int i;
- file1.c中 -
#include <header.h>
i = 10;
int main() {
func();
return 0;
}
- file2.c中 -
#include <header.h>
void func() {
printf("i = %d\n", i);
return;
}
我收到i
默认为int
的警告。如果我想将i
作为float
,我该怎么办?
答案 0 :(得分:1)
成功
extern int i;
标题中的和
int i = 10;
file1.c
中的。
警告意味着对于i = 10;
中的(不完整)声明file1.c
,应用“隐式整数”规则,特别是该行被解释为声明(因为分配不能出现)外部功能范围)。
答案 1 :(得分:1)
您的代码中有几处错误。第一个是你在头文件中定义变量i
,这意味着它将在包含头文件的所有源文件中定义。相反,您应将变量声明为extern
:
extern int i;
另一个问题是你不能只在file1.c中分配全局范围内的变量。相反,你应该定义变量:
int i = 10;
答案 2 :(得分:1)
在标题中声明为extern
(这意味着它的内存保留在其他地方):
/* header.h */
extern int i;
然后仅在一个.c
文件中定义,即实际为其保留内存:
/* file1.c */
int i = <initial value>;
答案 3 :(得分:0)
在标题中使用
extern int i;
file1.c
或file2.c
int i = 20;
如果您希望float
只需将int
更改为float
答案 4 :(得分:0)
在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文件中添加任何形式的变量定义。