C语言 使用 extern 变量编译程序时出现问题


当我

创建一个单独的块(新的花括号对)时,在main()函数内部,如下所示:

int main(void){
    int x = 10;
    {
        extern int y;
        printf("tNo. is %dn", y);
        int y = 20;
    }
}

当我编译此代码时,我遇到了一个错误:

test.c: In function ‘main’:
test.c:12:9: error: declaration of ‘y’ with no linkage follows extern declaration
 int y = 20;
test.c:9:16: note: previous declaration of ‘y’ was here
 extern int y;

如果int y的定义放在main函数的末尾,则代码可以编译并运行正常。

此错误背后的原因可能是什么?根据我的书,如果一个变量被声明为 extern,那么我们可以在定义它之前使用它,编译器将在整个文件中搜索变量的定义。

C 区分文件作用域中的变量

(= 在任何函数之外)和局部作用域中的变量。

使用 extern 声明并在printf中使用的 y -变量是指文件范围内的变量。该变量仅声明,必须在其他地方"定义"。也就是说,必须为其分配存储。

如果您在任何{}中有第二个y声明,则这是一个与文件范围变量不同的局部变量。如果它在外部,则它是文件范围变量的声明和该文件范围变量的"暂定定义"。因此,在后面的情况下,您有一个声明,该声明在使用变量的位置可见,而在其他地方则有一个定义,以便提供存储,并且一切正常。

您不能在具有相同块范围的块中两次声明具有相同名称的变量。

是的,当您在那里使用 extern 时,那里有问题。 这意味着此 int y 是在同一文件或不同文件中全局定义的。 但是没有定义 y(全局),您正在打印该 extern 值,这就是为什么它对链接器出错的原因

相关内容

  • 没有找到相关文章

最新更新