对于 extern 存储类的理解

7 浏览
0 Comments

对于 extern 存储类的理解

这个问题已经有了答案:

定义和声明之间的区别是什么?

请问有人能解释一下下面问题的流程吗?

#include 
int main(){
   extern int a;
   printf("%d\n",a);
   return 0;
}
int a = 20;

输出结果为20。我不确定变量a是在哪里被定义的,也不确定它在哪里被声明的。

admin 更改状态以发布 2023年5月21日
0
0 Comments

C语言被设计成一次通过,这样编译器就可以从上到下逐行处理每一行。因此考虑你的程序:

#include 
int 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和其他依赖函数放在源代码的末尾,这样需要的额外声明就最少。

0
0 Comments

变量a在以下一行中被声明并定义为全局变量:

int a = 20;

extern行仅告诉main()函数范围中的a在另一个地方被定义。

在这种情况下,使用extern并不是必要的。您可以在main()函数之前声明和定义a,然后main()函数将对其熟悉。

通常,当您想要使用在另一个源文件中定义的变量或函数时,您将使用extern(而不仅仅是在同一源文件中稍后定义)。

0