繁体   English   中英

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

[英]Problems compiling program with extern variable

当我创建一个像这样的单独的块(一对新的花括号)时,在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的定义放在主函数的末尾,则代码将编译并完全正常运行。

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

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

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

extern声明并在printf使用的y变量是指文件范围内的变量。 该变量仅声明,并且必须在其他位置“定义”。 那就是必须为其分配存储空间。

如果您在任何{}都包含y的第二个声明,则这是一个与文件作用域变量不同的局部变量。 如果在外部,则它是文件作用域变量的声明和该文件作用域变量的“临时定义”。 因此,在此后一种情况下,您将看到一个声明,该声明在使用该变量的位置可见,而在其他位置则提供一个定义,例如提供存储,一切正常。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM