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