考虑给定的C代码:
#include<stdio.h>
extern int i;
int main(){
printf("%d", i);
return 0;
}
它给出了Compilation error
。如果我初始化extern int i=10;
,则输出为10
。
#include<stdio.h>
extern int i=10; //initialization statement
int main(){
printf("%d", i);
return 0;
}
此外,如果我指定int i=10;
,则输出为10
。
#include<stdio.h>
extern int i;
int i=10; //assignment
int main(){
printf("%d", i);
return 0;
}
并且
#include<stdio.h>
extern int i;
int main(){
int i=10; //assignment
printf("%d", i);
return 0;
}
变化:
#include<stdio.h>
extern int i;
int i=20;
int main(){
int i=10;
printf("%d", i);
return 0;
}
因为int i
是局部变量,所以输出为10
。
请您解释一下关于{C
中extern
存储类的重要观点
我在某处读到,声明声明了变量或函数的名称和类型。定义导致为要定义的函数的变量或主体分配存储。相同的变量或函数可能有很多声明,但该变量或函数只能有一个定义。
答案 0 :(得分:4)
考虑
int i;
在程序的所有功能之外声明,包括main
。
这意味着i
将有
考虑
extern int i;
在该计划的所有功能之外宣布,包括main
这意味着i
将有
i
仅被声明,未定义,表示未分配空间。i
在其他地方定义,可能在包含文件考虑
extern int i=10;
在该计划的所有功能之外宣布,包括main
在这种情况下,您需要初始化extern
变量i
。在这种情况下
i
分配空间。10
。extern
被忽略,这意味着i
不是declared only
。注意强>
对于extern int i
,必须在其他地方定义变量,即在另一个源文件中定义。如果不是这种情况,则会出现编译时错误。
答案 1 :(得分:1)
extern存储类说明符用于提供对所有程序文件可见的全局变量的引用。当您使用'extern'时,该变量无法初始化,但是,它将变量名称指向先前已定义的存储位置。
答案 2 :(得分:1)
当代码通过extern
修饰符引用符号时,表示符号实际上是在别处而不是在当前文件中定义的。
一个例外,如果extern
修饰符用于当前文件中实际定义的符号,那就没问题。
答案 3 :(得分:0)
extern int i;
声明只是告诉编译器在某个地方(在这个或另一个源中)存在全局范围内i
的实际声明。它本身并不是i
的实际声明。因此,在该声明中为i
分配值是不合适的(这就是为什么第二次尝试无效)。您的第一次尝试无效,因为您没有实际声明i
。
你的第三个没问题,因为你有i
的实际声明,但你不必拥有extern int i;
声明。
您的最后一个示例涉及本地和全球范围内的i
。在这种情况下,将使用局部范围中的变量。这就是你不打印的原因。