首页 > 解决方案 > 没有外部的头文件中的全局变量

问题描述

在头文件中使用全局变量我们可以在另一个文件中更改值/使用变量(相同的值可以在多个文件中访问/修改),那么为什么可以使用 extern 呢?global 和 extern 和有什么不一样?

下面是我尝试过的示例它在 c 中的外部变量和全局变量之间没有区别。

程序编译运行成功,没有任何错误。

th

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

标签: cdeclarationstorage-class-specifier

解决方案


C11 6.9.2p2

具有文件范围的对象的标识符声明没有初始化程序,并且没有存储类说明符或具有存储类说明符 static,构成暂定定义。

这就是你所拥有的:一个暂定的定义

尝试不同的文件变化

int i;
int i = 42;
static int i;
static int i = 42;
extern int i;

gcc 文档中各种选项的描述可能会有所帮助

-fno-普通

在 C 代码中,此选项控制在没有初始化程序的情况下定义的全局变量的位置,在 C 标准中称为暂定定义。暂定定义不同于使用 extern 关键字声明的变量,后者不分配存储空间。

Unix C 编译器传统上在公共块中为未初始化的全局变量分配存储空间。这允许链接器将不同编译单元中同一变量的所有暂定定义解析为同一对象,或解析为非暂定定义。这是 -fcommon 指定的行为,并且是 GCC 在大多数目标上的默认行为。另一方面,ISO C 不要求这种行为,并且在某些目标上可能会对变量引用带来速度或代码大小的损失。

-fno-common 选项指定编译器应该将未初始化的全局变量放置在目标文件的 BSS 部分中。这会阻止链接器合并暂定定义,因此如果在多个编译单元中定义了相同的变量,则会出现多重定义错误。使用 -fno-common 编译对于它提供更好性能的目标很有用,或者如果您希望验证该程序是否可以在始终以这种方式处理未初始化变量定义的其他系统上运行。


推荐阅读