如果默认情况下没有存储类的全局变量是'extern',那么为什么我不能访问这个变量?

时间:2018-01-03 08:52:48

标签: c

我有两个.c文件,其中一个有x的定义,另一个文件使用x,如下所示:

file1.c中:

int x;
//other code...

main.c中:

int main(void)
{
    printf("%d", x);
}

现在,当我编译此代码时,我收到以下编译错误消息:

In function 'main':

error: 'x' undeclared (first use in this function)

因此,如果一个全局变量(在本例中为x)默认为'extern',那么为什么main.c文件无法看到x

现在我转到main.c并定义x,以便main.c现在看起来像:

int x=9; //This line was added.

int main(void)
{
    printf("%d",x);
}

并且还在file1.c中初始化x,程序无法编译,我收到以下错误消息:

error: ld returned 1 exit status

所以,如果main.c看不到x中的file1.c,那么这次问题是什么?

这是链接错误吗?

请注意,当我添加

extern int x;
main.c中的

,问题就消失了。

2 个答案:

答案 0 :(得分:2)

每个编译单元(在本例中为您的个人.c文件)分别是编译。编译器需要知道x的存储类才能处理它,所以你的第一个错误(undeclared)来自编译器,不知道x是什么。编译器需要知道x所在的位置。

当您将编译后的对象链接时,链接器会解析所有外部名称(如果您已标记x,则会main.c中包含extern)然后最终的可执行文件将其所有变量放在已知位置。如果它找到2个具有相同名称的外部符号,则它将失败,从而导致第二个错误(error: ld returned 1 exit status)。

答案 1 :(得分:1)

  1. 您必须在main.c中声明变量,因此编译器知道它:extern int x。编译器对你说:错误:' x'未申报

  2. 您在main.c中添加了x的第二个定义,这是您在file1.c中执行的第一个定义。链接器告知您两个定义之间的歧义。您可以阅读错误上方的错误:ld返回1退出状态