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

what does it mean when there exist both declaration of variable and its extern declaration in the same file?

当我分析一些源代码时,我发现以下定义 在一个文件 (.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 关键字和普通变量声明位于同一文件中时,是否有任何特殊含义?

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

FILE *yyin, *yyout;

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

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

在你的例子中,变量 yyinyyout 有一个声明,说明变量具有外部链接,以及一个将两个变量初始化为 NULL.

的定义

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