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

C 当同一个文件中同时存在变量声明及其外部声明时,这意味着什么?,c,variables,extern,C,Variables,Extern,在分析一些源代码时,我在一个文件(.c)中发现了以下定义,而不是不同的文件(这是flex生成的文件中的一个代码,并且没有包含定义yyin的文件(stdio.h、string.h、errno.h、stdlib.h、inttypes.h): 我基本上知道这些话的意思 但是,extern关键字用于使用位于另一个文件中的变量和函数等定义。(它不为其分配内存。) 我的意思是,代码: FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 必须出现在另一个文件中,而不是同

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

我基本上知道这些话的意思

但是,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关键字和普通变量声明位于同一文件中时,是否有特殊含义?

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

回想一下,每个变量都有作用域、存储持续时间和链接。关键字
extern
指定变量具有外部链接;链接的其他选项有
静态
和无链接

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

在本例中,变量
yyin
yyout
有一个声明,说明变量具有外部链接,以及一个将两个变量初始化为
NULL
的定义


*它等效的原因是没有其他声明
yyin
yyout
。一般来说,如果在同一翻译单元中没有提供其他定义,则没有
extern
的声明可能成为定义。这称为暂定定义。带有
extern
的声明不会成为一个暂定定义。

因此,在我的例子中,虽然全局变量默认具有外部链接,但在这里使用extern关键字显式表示它显式地告诉它具有外部链接。我说的对吗?@user7159879对。这是一种声明常用全局变量的不同寻常的方式。使用和不使用
extern
并不完全相同。没有
extern
这可能是一个暂定的定义,而
extern
则不能。JensGustedt你说得对,谢谢你的提示。我编辑了答案以包含一个解释。如果您考虑一下
#include
是如何工作的,您会意识到,具有定义的翻译单元也有外部声明是正常的
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;
FILE *yyin, *yyout;