您好我有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’
。
b.c如何能够访问j
而不会抛出错误,因为j
的范围仅适用于a.c
?
答案 0 :(得分:1)
首先,在将其声明为extern的同时初始化变量没有任何意义。这就是你得到编译器警告的原因。如果变量在文件范围内,C允许它,但一如既往,C允许许多不好的事情。
另请注意,使用extern几乎总是不好的做法,应该避免使用。
现在对于代码,i
的行为与预期一致,因为两个文件中的i
都引用相同的变量。另一方面,j
是static
,因此该变量的范围缩小为本地文件。标准中有一条规则,即除非程序员明确地初始化它们,否则必须将所有静态变量初始化为0。因此j
的值将为0.
由于j
是静态的,extern int j;
引用“另一个j在其他地方”,因为您编写extern的文件中没有j
变量可见。由于程序不使用“其他j在其他地方”,因此该变量将被丢弃。
static
和extern
在很多方面彼此对立。如果您认为将静态和外部相同的变量声明为有意义,则需要更多地研究静态关键字。
答案 1 :(得分:0)
交流转换器
#include <stdio.h>
int i;
static int j;
extern void display();
int main()
{
printf("i = %d\n",i);
printf("j = %d\n",j);
display();
return 0;
}
b.c
#include <stdio.h>
extern int i;
extern int j;
void display()
{
printf ("%d",j);
}
C.C
#include <stdio.h>
extern int i=2;
extern int j=5;
void display()
{
printf ("%d",j);
}
如果编译a.c和b.c,GCC会抱怨
未定义对`j'的引用。
因为程序试图访问未在b.c范围内定义的j
如果你编译了a.c和c.c,GCC会按你所说的那样发出警告
警告:'初始化并声明âexternâ
并假定在c.c中定义j并且不会抛出任何错误。
在你的情况下如果删除b.c中的赋值,你在编译时就不会发现任何错误,因为在b.c中没有函数可以访问j的值。
答案 2 :(得分:0)
createPartControl()
数据默认用static
初始化,这就是为什么你得到0作为答案,它与b.c模块无关。另外一个变量不能同时声明0
和static
,听起来像是一个矛盾。
使用extern
时,您应该只声明一个变量(没有设置空格以将其保存在内存中),该变量的定义将在其他模块中。以一种简单的方式extern
告诉编译器,嘿不要担心它在模块中其他地方定义的变量,所以不要为它设置任何空间。
为什么编译器不会抛出错误? b.c是否在程序中与a.c链接?尝试这样做,看看会发生什么。