C 当同一个文件中同时存在变量声明及其外部声明时,这意味着什么?
在分析一些源代码时,我在一个文件(.c)中发现了以下定义,而不是不同的文件(这是flex生成的文件中的一个代码,并且没有包含定义yyin的文件(stdio.h、string.h、errno.h、stdlib.h、inttypes.h): 我基本上知道这些话的意思 但是,extern关键字用于使用位于另一个文件中的变量和函数等定义。(它不为其分配内存。) 我的意思是,代码:C 当同一个文件中同时存在变量声明及其外部声明时,这意味着什么?,c,variables,extern,C,Variables,Extern,在分析一些源代码时,我在一个文件(.c)中发现了以下定义,而不是不同的文件(这是flex生成的文件中的一个代码,并且没有包含定义yyin的文件(stdio.h、string.h、errno.h、stdlib.h、inttypes.h): 我基本上知道这些话的意思 但是,extern关键字用于使用位于另一个文件中的变量和函数等定义。(它不为其分配内存。) 我的意思是,代码: FILE *yyin = (FILE*) 0, *yyout = (FILE *) 0; 必须出现在另一个文件中,而不是同
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
,而不是依赖默认值。由于变量是在文件范围内声明的,因此默认情况下它们具有外部链接,即在您的情况下,声明等效于*
回想一下,每个变量都有作用域、存储持续时间和链接。关键字extern
指定变量具有外部链接;链接的其他选项有静态
和无链接
变量可以有多个声明。只要多个声明不相互冲突,C编译器就可以组合它们
在本例中,变量yyin
和yyout
有一个声明,说明变量具有外部链接,以及一个将两个变量初始化为NULL
的定义
*它等效的原因是没有其他声明
yyin
和yyout
。一般来说,如果在同一翻译单元中没有提供其他定义,则没有extern
的声明可能成为定义。这称为暂定定义。带有extern
的声明不会成为一个暂定定义。因此,在我的例子中,虽然全局变量默认具有外部链接,但在这里使用extern关键字显式表示它显式地告诉它具有外部链接。我说的对吗?@user7159879对。这是一种声明常用全局变量的不同寻常的方式。使用和不使用extern
并不完全相同。没有extern
这可能是一个暂定的定义,而extern
则不能。JensGustedt你说得对,谢谢你的提示。我编辑了答案以包含一个解释。如果您考虑一下#include
是如何工作的,您会意识到,具有定义的翻译单元也有外部声明是正常的
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;
FILE *yyin, *yyout;