2

当我创建一个单独的块(新的一对花括号)时,在 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,那么我们可以在定义它之前使用它,编译器将在整个文件中搜索变量的定义。

4

3 回答 3

0

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

于 2013-12-29T12:01:06.630 回答
0

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

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

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

于 2013-12-29T12:05:01.460 回答
0

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

于 2013-12-29T12:06:19.920 回答