我有2个模块(.c文件)和一个.H头文件:全局变量
file1.c中:
#include <stdio.h>
#include "global.h"
int main()
{
i = 100;
printf("%d\n",i);
foo();
return 0;
}
file2.c中
#include <stdio.h>
#include "global.h"
void foo()
{
i = 10;
printf("%d\n",i);
}
global.h
int i;
extern void foo()
当我做gcc file1.c file2.c everythin克工作正常,我得到预期的输出。现在,当我初始化变量“我”在头文件中说0和重新编译我得到一个链接错误:
/tmp/cc0oj7yA.o:(.bss+0x0): multiple definition of `i'
/tmp/cckd7TTI.o:(.bss+0x0): first defined here
如果我只是初始化编译file1.c中(除电话为foo())在头文件即gcc file1.c中,一切正常。到底是怎么回事?
我说过什么?“把是'的extern INT I;'或'只是INT I;'进头文件”:'EXTERN INT i'是更好,因为它立刻会告诉你,如果“真实”的定义是由一些意外丢失。仅仅使用'int i',就会给'0'一个无声的定义。 – glglgl
我没有得到第一个解释,你可以详细说明,因为当内存分配给变量我。直到现在我明白的是int我在global.h中相当于extern int i;这意味着这两个目标文件都有引用,这个内存是我在其他地方分配的。 – user2383973
@ user2383973内存由链接器分配和保留。当它看到一个带有任务和一个“暂定”定义的请求时,一切都很好。当它看到几个作业时,即使它们具有相同的值,也不行。 – glglgl