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

时间:2017-09-20 03:02:51

标签: c variables extern

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

1 个答案:

答案 0 :(得分:2)

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

FILE *yyin, *yyout;

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

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

在您的案例中,变量yyinyyout有一个声明,表明变量具有外部链接,以及一个将两个变量初始化为NULL的定义。

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