当跨文件定义具有相同名称的全局变量时,内存中实际上只定义了该变量的一个实例。例如,int temp 是在 a.c、b.c 和 main.c 中定义的,当我检查变量的地址时,它们在所有文件中都是相同的。
现在变量在没有使用说明符 extern 的情况下进行扩展,那么 extern 有什么用呢?
文件交流
int temp;
a()
{
temp = 10;
printf("the value of temp in a.c is %dn",temp);
}
文件 B.C
int temp;
b()
{
temp = 20;
printf("the value of temp in b.c is %dn",temp);
}
文件 main.c
int temp;
main()
{
temp = 30;
a();
b();
printf("the value of temp in main.c is %dn",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,因为它在 bc 中发生了变化,并且最新的值正在得到反映。为什么变量 temp 在不创建 3 个不同变量的情况下得到扩展?
您不小心利用了标准 C 的通用扩展,如附录 J.5.11 多个外部定义中所述。
对象的标识符可能有多个外部定义,带有 或 没有明确使用关键字 extern;如果定义不一致,或超过定义 一个是初始化的,行为是未定义的(6.9.2)。
这有时也被称为基于Fortran COMMON块的变量处理的"通用模型"。 请参阅如何使用 extern
在 C 语言中的源文件之间共享变量?了解更多信息。 不过,您目前不需要全部阅读。
您的代码没有严格符合标准。 但是,您将在许多(但不是全部)系统上侥幸逃脱。 (C++有一个更强大的规则,称为 ODR — 一个定义规则。 您可以将 C 规则视为 ODR-lite;但是您的代码甚至违反了 ODR-lite。