如何定义外部变量?

Shi*_*ale 1 c declaration definition extern

关于在C中使用extern关键字和变量,我有一些疑问.我确实浏览了与此问题相关的链接.但是,还有一些我没有收集得很好的东西

#include<stdio.h>
    main( )
    {
    extern int i;
    printf ( "\n%d ",i) ) ;
    }
    int i = 31 ;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,如何在定义语句之前打印?
现在在以下代码中:

#include<stdio.h>
int x = 21 ;
main( )
{extern int i;
 i=20;
printf ( "\n%d ", i ) ;
}
Run Code Online (Sandbox Code Playgroud)

不是声明"i = 20;" 定义声明?我得到一个错误.是因为我正在尝试更改其他源文件中定义的变量吗?如果是这种情况,语句如何"int i = 31;" 在最顶级的代码片段中使用权?

另外,我读到,"int i;" 是一个定义.我真的不怎么做.

jxh*_*jxh 5

在第一个程序中,print语句i根据声明打印值extern int i.这类似于基于其原型声明调用函数而不看其定义.编译器生成代码以检索名为的全局变量中的值i.符号在链接时解析为正确的变量和地址.

在第二个程序中,没有i提供定义,只提供extern int i声明,并尝试设置其值i = 20.在链接时,由于没有定义,因此失败,因此解析对全局变量的引用的尝试失败.而是更改i = 20int i = 20创建i在函数范围内命名的局部变量main(),并且不再引用全局声明的变量extern int i.

int i;在全局范围内使用,它被视为一个声明,可以被视为一种定义.使用初始化程序声明的全局变量,如:

int i = 20;
Run Code Online (Sandbox Code Playgroud)

始终被视为一个定义.只允许使用此类型的一个定义,即使每个定义使用相同的初始化值.然而,

int i;
Run Code Online (Sandbox Code Playgroud)

被视为宣言.如果出现多个这样的声明,则它们都被视为同一变量的声明.同时,如果没有带初始值设定项的声明,则使用初始值设定项0隐式定义此变量,链接器将能够解析对它的引用.