我下面有2个C
个文件。从我读到的我知道全局变量的默认存储类是extern。如果我明确键入它我得到未定义的变量错误。我在这里失踪了什么?这是否意味着当我省略extern关键字时它会成为一个定义,但当我输入它只是一个声明?
file1.c中
#include <stdio.h>
#include <stdlib.h>
extern void file2function();
int variable; // if i put extern i will get error, isnt it implicitly extern?
int main()
{
variable = 1;
printf("file1 %d\n",variable);
file2function();
return 0;
}
file2.c中
#include <stdio.h>
#include <stdlib.h>
extern int variable;
void file2function(){
variable = 2;
printf("file2 %d\n",variable);
return;
}
答案 0 :(得分:4)
You need to take a look at the difference between a definition and a declaration
也就是说,带有extern
存储的变量声明是对编译器的暗示,即对象在其他地方(或翻译单元)中定义。它本身并不是一个定义。
您需要在用于生成二进制文件的翻译单元之一中定义。
在您的情况下,如果您将extern
放在两个文件中,int variable
将成为两种情况下的声明。这就是为什么在链接阶段,编译器找不到承诺的定义,所以它尖叫。
另一方面,如果从一个(仅一个)文件中删除extern
,则在该文件中,int variable;
是定义< / em>和另一个翻译单元指的是这个定义,所以,一切都很好。