如果默认情况下'extern'没有存储类的全局变量,那么为什么我无法访问此变量?



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

文件1.c:

int x;
//other code...

主.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看不到file1.c中的x,那么这次有什么问题呢?

这是链接错误吗?

请注意,当我添加

extern int x;

main.c,问题消失了。

每个编译单元(在本例中为单独的.c文件(都是单独编译的。编译器需要知道x的存储类才能处理它,所以你的第一个错误(undeclared(来自编译器不知道x是什么。编译器不需要知道x住在哪里。

然后,当您将编译的对象链接在一起时,链接器会解析任何外部名称(包括main.c中的x,如果您已将其标记为extern(,然后最终可执行文件的所有变量都将位于已知位置。如果它找到 2 个同名的外部符号,那么它将失败,给你第二个错误 ( error: ld returned 1 exit status (。

  1. 您必须在 main.c 中声明变量,以便编译器知道它:extern int x .编译器对你说:错误:"x"未声明

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

最新更新