对于 extern 存储类的理解
对于 extern 存储类的理解
这个问题已经有了答案:
请问有人能解释一下下面问题的流程吗?
#include int main(){ extern int a; printf("%d\n",a); return 0; } int a = 20;
输出结果为20。我不确定变量a是在哪里被定义的,也不确定它在哪里被声明的。
admin 更改状态以发布 2023年5月21日
C语言被设计成一次通过,这样编译器就可以从上到下逐行处理每一行。因此考虑你的程序:
#includeint main(){ extern int a; printf("%d\n",a); return 0; } int a = 20;
标识符a
被声明两次,定义一次。
第4行extern int a;
之前,编译器对标识符a
一无所知。声明extern int a;
在函数main
中具有块作用域,并将标识符a
声明为一个int
,其存储期为静态,链接为外部。因此,编译器可以编写访问全局标识符a
的代码,作为int
变量,在另一个模块中可以定义(外部链接)。这就是编译器在第5
行在printf
中使用时所做的。
最后在第9行,int a = 20;
是另一个声明和定义。这将a
声明和定义为具有静态存储期和外部链接的int
。
如果将int a = 20;
放在main
之前,则声明extern int a;
将是无用的,因为它没有增加任何内容。我倾向于将我的main
和其他依赖函数放在源代码的末尾,这样需要的额外声明就最少。