当跨文件定义具有相同名称的全局变量时,实际上只在内存中定义了变量的一个实例。例如,int temp在a.c,b.c和main.c中定义,当我检查变量的地址时,它们在所有文件中都是相同的。
现在变量正在使用说明符extern进行扩展,那么extern的用途是什么?
档案a.c
int temp;
a()
{
temp = 10;
printf("the value of temp in a.c is %d\n",temp);
}
文件b.c
int temp;
b()
{
temp = 20;
printf("the value of temp in b.c is %d\n",temp);
}
file main.c
int temp;
main()
{
temp = 30;
a();
b();
printf("the value of temp in main.c is %d\n",temp);
}
o / p是
the value of temp in a.c is 10
the value of temp in b.c is 20
the value of temp in main.c is 20.
在上面的例子中,main.c中temp的值也是20,因为它在b.c中发生了变化,并且最新值被反映出来。 为什么变量temp会在不创建3个不同变量的情况下得到扩展?
答案 0 :(得分:4)
您偶然会利用附件J.5.11多重外部定义中所述的标准C的通用扩展。
对象的标识符可能有多个外部定义,用或 没有明确使用关键字extern;如果定义不同意或不同 一个被初始化,行为未定义(6.9.2)。
这有时也被称为“常见模式”。变量处理,基于Fortran COMMON块。有关详细信息,请参阅How do I use extern
to share variables between source files in C?。不过,你现在还不需要阅读所有内容。
您的代码不严格符合标准。但是,您将在许多(但不是全部)系统中使用它。 (C ++有一个更强大的规则称为ODR - 一个定义规则。您可以将C规则视为ODR-lite;但是您的代码甚至违反了ODR-lite。)