在我分析一些源代码时,我发现在一个文件(.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关键字和常规变量声明存在于同一文件中时,是否有任何特殊含义?
答案 0 :(得分:2)
第一个声明是不寻常的,因为它明确指定extern
,而不是依赖于默认值。由于变量是在文件范围内声明的,因此默认情况下它们具有外部链接,即在您的情况下,声明等效于 * 到
FILE *yyin, *yyout;
回想一下,每个变量都有范围,存储持续时间和链接。关键字extern
指定变量具有外部链接;链接的其他选项是static
,没有链接。
变量可以有多个声明。只要多个声明不相互冲突,C编译器就可以将它们组合起来。
在您的案例中,变量yyin
和yyout
有一个声明,表明变量具有外部链接,以及一个将两个变量初始化为NULL
的定义。
* 它等同的原因是没有yyin
和yyout
的其他声明。通常,如果在同一翻译单元中没有提供其他定义,则没有extern
的声明可以成为定义。这称为暂定定义。 extern
的声明不会成为暂定的定义。