当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?
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编译器就可以将它们组合起来。
在您的情况下,变量 yyin
和 yyout
有一个声明说变量具有外部链接,以及一个将两个变量初始化为 NULL
的定义。
*之所以等价,是因为没有yyin
和yyout
的其他声明。通常,如果在同一翻译单元中没有提供其他定义,则没有extern
的声明可能会成为定义。这称为暂定定义。带有extern
的声明不会成为暂定定义。
【讨论】:
所以,在我的例子中,虽然全局变量默认具有外部链接,但在这里使用 extern 关键字明确意味着它明确告诉它具有外部链接。我说的对吗? @user7159879 对。这是一种不寻常的方式来声明一个普通的全局变量。 有和没有extern
并不完全相同。如果没有extern
,它可能是一个暂定定义,如果没有extern
,它就不行。
@JensGustedt 你说得对,谢谢你的留言。我编辑了答案以包含解释。以上是关于当在同一个文件中同时存在变量声明及其外部声明时,这意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章
请问C++中啥是函数的定义性声明和函数的引用性声明,有啥区别