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;" 是一个定义.我真的不怎么做.
在第一个程序中,print语句i根据声明打印值extern int i.这类似于基于其原型声明调用函数而不看其定义.编译器生成代码以检索名为的全局变量中的值i.符号在链接时解析为正确的变量和地址.
在第二个程序中,没有i提供定义,只提供extern int i声明,并尝试设置其值i = 20.在链接时,由于没有定义,因此失败,因此解析对全局变量的引用的尝试失败.而是更改i = 20为int 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隐式定义此变量,链接器将能够解析对它的引用.