在头文件中使用全局变量我们可以在另一个文件中更改值/使用变量(相同的值可以在多个文件中访问/修改),那么为什么可以使用 extern 呢?global 和 extern 和有什么不一样?
下面是我尝试过的示例它在 c 中的外部变量和全局变量之间没有区别。
程序编译运行成功,没有任何错误。
日
int i;
t1.c
#include<stdio.h>
#include "t.h"
int main()
{
i=10;
printf("%s i = %d\n",__func__, i);
t2();
printf("%s i = %d\n",__func__, i);
i=200;
printf("%s i = %d\n",__func__, i);
t3();
printf("%s i = %d\n",__func__, i);
return 0;
}
t2.c
#include<stdio.h>
#include "t.h"
void t2()
{
printf("%s i=%d\n",__func__, i);
i = 100;
printf("%s i=%d\n",__func__, i);
}
t3.c
#include<stdio.h>
#include "t.h"
void t3()
{
printf("%s i=%d\n",__func__, i);
i = 300;
printf("%s i=%d\n",__func__, i);
}
输出:- gcc t1.c t2.c t3.c
main i = 10
t2 i=10
t2 i=100
main i = 100
main i = 200
t3 i=200
t3 i=300
main i = 300
具有文件作用域的对象的标识符声明,没有初始值设定项,没有存储类说明符或存储类说明符 static,构成了一个暂定定义。
所以这就是你所拥有的:一个暂定定义。
尝试文件 th 中的不同变体
int i;
int i = 42;
static int i;
static int i = 42;
extern int i;
-fno-common
在 C 代码中,此选项控制在没有初始化程序的情况下定义的全局变量的位置,在 C 标准中称为暂定定义。暂定定义与带有 extern 关键字的变量声明不同,后者不分配存储空间。
Unix C 编译器传统上在公共块中为未初始化的全局变量分配存储空间。这允许链接器将不同编译单元中相同变量的所有暂定定义解析为同一个对象,或解析为非暂定定义。这是 -fcommon 指定的行为,并且是大多数目标上 GCC 的默认行为。另一方面,ISO C 不要求这种行为,并且在某些目标上可能会在变量引用上带来速度或代码大小的损失。
-fno-common 选项指定编译器应将未初始化的全局变量放在目标文件的 BSS 部分。这会阻止链接器合并临时定义,因此如果在多个编译单元中定义了相同的变量,则会出现多定义错误。使用 -fno-common 进行编译对于提供更好性能的目标很有用,或者如果您希望验证该程序是否可以在始终以这种方式处理未初始化变量定义的其他系统上运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句