[英]What does the 'extern' keyword does that makes the following code legal?
为什么以下代码会编译? num变量何时获得其值?
#include <stdio.h>
extern int num;
void main()
{
printf("%d", num); //prints 3
}
int num = 3;
示例: 实时代码
在您的代码中
extern int num;
被称为声明 。 太太
int num = 3;
是具有显式初始化的定义。 该语句设置值。 该值在编译时确定,并在main()
开始执行之前设置。
也就是说, void main()
应该是int main(void)
,至少要符合标准。
之所以起作用,是因为您已声明num
以便可以在函数的代码中对其进行命名,并且因为已在名称空间范围内对其进行了定义 ,以便在静态初始化时(即在执行main
之前)对其进行初始化。
从这个意义上讲,您当前编写的程序与以下内容基本没有区别:
#include <stdio.h>
int num = 3;
void main()
{
printf("%d", num); //prints 3
}
初始化变量的“位置”并不特别相关,只要在您尝试使用变量之前及时进行初始化即可。
顺便说一句,您必须使main
返回int
,而不是void
。
extern
标记了稍后定义的变量的声明。 定义中, int num = 3;
部分是实际为变量分配内存并设置其值的内容(它也作为声明的两倍)。 C / C ++是在使用前声明的,如果您没有执行extern int num;
那么在使用时将不会声明num
。 当然,您也可以删除extern
行并将num
的定义上移到main()
以上。
这里有两件事在起作用。 在编译期间,必须在使用前在源文件中的一点声明num
。 至于何时获得它的值分配,这是在程序加载期间出现的。 文件范围内(所有函数之外)的所有变量(如num
均已分配其内存,并且其值(如果在main()
调用之前进行了初始化main()
也已被分配。 如果在定义中未给它们赋值,则它们可能包含任何内容,因此不要对未初始化变量的值做任何假设。 您也不能对它们的初始化顺序做任何假设,因此在初始化这样的变量时不要引用其他文件作用域变量。
extern
与声明一起使用。 它告诉编译器该事物将在其他地方定义。 当您有多个文件使用相同的变量或函数时,此功能很有用。 您可以将extern
声明放在头文件中,并在源文件中定义共享变量/函数。
如果从代码中删除extern
,则将两次定义num
,这是不允许的。 要摆脱extern
声明,只需将您的int num = 3;
在文件的顶部。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.