跨不同文件创建新的全局变量是扩展相同的变量

时间:2015-01-20 07:25:27

标签: c scope global-variables extern

当跨文件定义具有相同名称的全局变量时,实际上只在内存中定义了变量的一个实例。例如,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个不同变量的情况下得到扩展?

1 个答案:

答案 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。)