当同一个文件中同时存在变量声明及其外部声明时,这意味着什么?
what does it mean when there exist both declaration of variable and its extern declaration in the same file?
当我分析一些源代码时,我发现以下定义 在一个文件 (.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 关键字和普通变量声明位于同一文件中时,是否有任何特殊含义?
第一个声明的不寻常之处在于它明确指定了 extern
,而不是依赖默认值。由于变量是在文件范围内声明的,因此默认情况下它们具有外部链接,即在您的情况下,声明等效于 * 到
FILE *yyin, *yyout;
回想一下,每个变量都有一个范围、存储持续时间和链接。关键字 extern
指定变量具有外部链接;链接的其他选项是 static
和无链接。
变量可以有多个声明。只要多个声明相互不冲突,C编译器就可以将它们组合起来。
在你的例子中,变量 yyin
和 yyout
有一个声明,说明变量具有外部链接,以及一个将两个变量初始化为 NULL
.
的定义
*之所以等价是因为没有yyin
和yyout
的其他声明。一般来说,如果在同一翻译单元中没有提供其他定义,则没有 extern
的声明可以成为定义。这叫做暂定。带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 关键字和普通变量声明位于同一文件中时,是否有任何特殊含义?
第一个声明的不寻常之处在于它明确指定了 extern
,而不是依赖默认值。由于变量是在文件范围内声明的,因此默认情况下它们具有外部链接,即在您的情况下,声明等效于 * 到
FILE *yyin, *yyout;
回想一下,每个变量都有一个范围、存储持续时间和链接。关键字 extern
指定变量具有外部链接;链接的其他选项是 static
和无链接。
变量可以有多个声明。只要多个声明相互不冲突,C编译器就可以将它们组合起来。
在你的例子中,变量 yyin
和 yyout
有一个声明,说明变量具有外部链接,以及一个将两个变量初始化为 NULL
.
*之所以等价是因为没有yyin
和yyout
的其他声明。一般来说,如果在同一翻译单元中没有提供其他定义,则没有 extern
的声明可以成为定义。这叫做暂定。带extern
的声明不会成为暂定定义。