【问题标题】:Creating a new global variable across different files is extending the same variable在不同的文件中创建一个新的全局变量就是扩展同一个变量
【发布时间】:2015-03-18 08:28:31
【问题描述】:

当跨文件定义同名全局变量时,内存中实际上只定义了一个变量的实例。例如 int temp 在 a.c、b.c 和 main.c 中定义,当我检查变量的地址时,它们在所有文件中都是相同的。

现在变量在没有使用说明符extern的情况下得到扩展,那么extern有什么用呢?

文件交流

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);
}  

文件 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 个不同的变量?

【问题讨论】:

    标签: c scope global-variables extern


    【解决方案1】:

    您无意中利用了标准 C 的通用扩展,如附件 J.5.11 多个外部定义中所述。

    一个对象的标识符可能有多个外部定义,带有或 没有明确使用关键字 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。)

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 2012-08-21
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多