繁体   English   中英

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

[英]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编译器就可以将它们组合在一起。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM