[英]what does it mean when there exist both declaration of variable and its extern declaration in the same file?
当我分析一些源代码时,我在一个文件(.c)中找到了以下定义,而不是不同的文件 (这是flex生成的文件中的代码之一,并且没有包含文件(stdio.h,string.h, errno.h,stdlib.h,inttypes.h)定义了yyin):
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编译器就可以将它们组合在一起。
在您的情况下,变量yyin
和yyout
有一个声明,表明变量具有外部链接,以及一个将两个变量初始化为NULL
的定义。
*它等同的原因是没有yyin
和yyout
其他声明。 通常,如果在同一翻译单元中没有提供其他定义,则不带extern
的声明可以成为定义。 这称为暂定定义 。 与extern
的声明不会成为暂定的定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.