使用extern变量编译程序的问题

时间:2013-12-29 11:55:12

标签: c storage-class-specifier

当我创建一个单独的块(新的花括号)时,在main()函数内部,就像这样 - :

int main(void){

    int x = 10;
    {
        extern int y;
        printf("\tNo. is %d\n", 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,那么我们可以在定义它之前使用它,编译器将在整个文件中搜索变量的定义。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

C区分文件范围中的变量(=任何函数外部的变量)和本地范围中的变量。

y - 您使用extern声明并在printf中使用的变量是指文件范围中的变量。该变量仅被声明,必须在其他地方“定义”。那就是必须为它分配存储空间。

如果你在任何y内有{}的第二个声明,那么这是一个与文件范围变量不同的局部变量。如果它在外面,则它是文件范围变量的声明和该文件范围变量的“暂定定义”。所以在后面这种情况下,你有一个声明,在使用变量的地方是可见的,在其他地方有一个定义,提供存储,一切正常。

答案 2 :(得分:0)

是的,当你在那里使用extern时有问题。这意味着此int在同一文件或不同文件中全局定义。但是没有定义y(全局),你打印的是外部值,这就是链接器错误的原因