没有extern的头文件中的全局变量

潘卡伊·苏里亚万什

在头文件中使用全局变量我们可以在另一个文件中更改值/使用变量(相同的值可以在多个文件中访问/修改),那么为什么可以使用 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
下午

C11 6.9.2p2

具有文件作用域的对象的标识符声明,没有初始值设定项,没有存储类说明符或存储类说明符 static,构成了一个暂定定义。

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

尝试文件 th 中的不同变体

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

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

-fno-common

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

头文件中的全局变量

在头文件中隐藏函数和全局变量

C 头文件中的全局变量初始化

为什么C头文件中的全局变量定义有效?

如何使用头文件在文件之间共享全局变量?

如何在头文件中正确声明全局变量?

为什么Java中没有全局变量?

R 中没有全局变量的范围

我的JavaScript函数中没有看到全局变量

在标头中声明全局变量ʻextern const int`,但在源文件中声明仅`int`

如何在Python的extern文件中保存全局变量?

没有受限的全局变量

全局变量PHP没有更新

全局变量私有文件

为什么即使使用#ifndef HEADER_H也不能在头文件中声明和分配全局变量

多个文件中的Python全局变量

C++ - 在另一个头文件中包含一个头文件以使全局变量可用于数组声明

从extern模块执行全局变量

在 C 中没有全局变量或更改函数输入的函数内部数组的变量分配

matlab中未定义的函数或没有全局变量的变量

如果全局变量与子程序中的 INOUT 变量相同,则没有警告但错误

使变量在没有全局变量的函数外部可用

有没有更好的方法在脚本中设置全局变量

有没有简单的方法可以查看GDB中的全局变量列表?

有没有一种简单的方法可以在类中全局变量

为什么我的全局变量没有在Test :: Class中初始化?

如何在puppeteer中获取没有异步/等待的窗口的全局变量

为什么在Java中没有像C ++这样的全局变量?

如何在没有全局变量的celery任务中设置sqlalchemy会话