您好,我有以下 2 个文件
在 a.c
我有
#include <stdio.h>
int i;
static int j;
int main()
{
printf("i = %d\n",i);
printf("j = %d\n",j);
return 0;
}
在 b.c
我有
#include <stdio.h>
extern int i=2;
extern int j=5;
在这个例子中,当我运行时,我得到的答案是 2,0,但编译器抛出警告 initialized and declared ‘extern’
for both variables.
b.c 如何能够访问 j
而不会抛出错误,因为 j
的范围仅适用于 a.c
?
最佳答案
首先,在将变量声明为 extern 的同时初始化一个变量没有任何意义。这就是您收到编译器警告的原因。如果变量在文件范围内,C 允许它,但一如既往,C 允许很多不好的事情。
另请注意,使用 extern 几乎总是不好的做法,应该避免。
现在对于代码,i
的行为符合预期,因为两个文件中的 i
都引用相同的变量。另一方面,j
是static
,因此该变量的范围缩小到本地文件。标准中有一条规则说,所有静态变量都必须初始化为 0,除非程序员明确地初始化它们。所以 j
的值将为 0。
由于 j
是静态的,extern int j;
指的是“其他地方的另一个 j”,因为没有可见的 j
变量你写外部文件的文件。由于程序未使用“其他地方的另一个 j”,因此该变量将被简单地丢弃。
static
和 extern
在很多方面都是彼此相反的。如果您认为将同一个变量同时声明为 static 和 extern 是有意义的,则需要更多地研究 static 关键字。
关于c - 其他文件中的外部变量定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32864590/