C - 为全局变量显式编写extern关键字

时间:2017-05-28 18:08:24

标签: c declaration extern access-specifier

我下面有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;
}

1 个答案:

答案 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>和另一个翻译单元指的是这个定义,所以,一切都很好。