当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?

Posted

技术标签:

【中文标题】当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?【英文标题】:what does it mean when there exist both declaration of variable and its extern declaration in the same file?当在同一个文件中同时存在变量声明及其外部声明时,这意味着什么? 【发布时间】:2017-09-20 03:02:51 【问题描述】:

当我分析一些源代码时,我发现以下定义在一个文件(.c)中,而不是不同的文件(这是由 flex 生成的文件中的代码之一,没有包含定义 yyin 的文件(stdio.h、string.h、errno.h、stdlib.h、inttypes.h):

extern FILE *yyin, *yyout;

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0;

我基本上知道这些陈述是什么意思。

但是,extern 关键字用于使用存在于另一个文件中的变量和函数等定义。 (它不会为它分配内存。)

所以,我的意思是代码:

FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0;

必须出现在另一个文件中,而不是在同一个文件中。

例如,

a.c

extern File *yyin;  /* It means that a.c want to use yyin declared in b.c */

int main(void) 
   yyin = *expressions*; /* yyin is variable in b.c */

   return 0;


b.c

File *yyin = (FILE*) 0;

为什么它们存在于同一个文件中?同名的extern关键字和普通变量声明在同一个文件里有什么特殊含义吗?

【问题讨论】:

如果你想想#include 是如何工作的,你会发现,有定义的翻译单元也有extern 声明是很正常的 【参考方案1】:

第一个声明的不寻常之处在于它明确指定了extern,而不是依赖于默认值。由于变量是在文件范围内声明的,因此默认情况下它们具有外部链接,即在您的情况下,声明等效于 *

FILE *yyin, *yyout;

回想一下,每个变量都有一个范围存储持续时间链接。关键字extern 指定一个变量有外部链接;其他链接选项是static 和无链接。

变量可以有多个声明。只要多个声明不相互冲突,C编译器就可以将它们组合起来。

在您的情况下,变量 yyinyyout 有一个声明说变量具有外部链接,以及一个将两个变量初始化为 NULL 的定义。

*之所以等价,是因为没有yyinyyout的其他声明。通常,如果在同一翻译单元中没有提供其他定义,则没有extern 的声明可能会成为定义。这称为暂定定义。带有extern 的声明不会成为暂定定义。

【讨论】:

所以,在我的例子中,虽然全局变量默认具有外部链接,但在这里使用 extern 关键字明确意味着它明确告诉它具有外部链接。我说的对吗? @user7159879 对。这是一种不寻常的方式来声明一个普通的全局变量。 有和没有extern 并不完全相同。如果没有extern,它可能是一个暂定定义,如果没有extern,它就不行。 @JensGustedt 你说得对,谢谢你的留言。我编辑了答案以包含解释。

以上是关于当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript基础

请问C++中啥是函数的定义性声明和函数的引用性声明,有啥区别

匿名内部类不能访问外部类方法中的局部变量,除非变量被声明为final类型

在 Django 中全局存储动态变量

如何为在 main() 外部和内部声明的变量分配内存

java声明局部变量时,省略大括号,可以同时声明两个名称和类型相同的局部变量吗?