C头文件中的全局变量初始化 [英] Global variables initialization in C header file

查看:45
本文介绍了C头文件中的全局变量初始化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道为什么在包含在C的多个源代码中的头文件中声明全局变量是可行的

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

int my_var;

#endif 

但是为其分配默认值不起作用:

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

int my_var = 0;

#endif 

它在我包含此主机的每个文件中显示多个编译错误。h

多个`my_var‘定义;app/src/testfile.o:app/inc/main.h:4:在此首次定义

我知道以这种方式声明全局变量不是最佳做法,但我不明白为什么添加赋值会导致编译错误,并且找不到明确的答案。

推荐答案

使用您正在使用的构建工具和开关,int my_var;主要充当不是定义的声明。允许多个对象标识符声明。

int my_var = 0;是一个定义。应该只有一个定义。

由于C的使用和开发历史,int my_var;从技术上讲是一个暂定定义。如果翻译单元中没有my_var的常规定义(正在编译的源文件,包括它包含的所有文件),它将充当常规定义。

但是,当您在包含在多个源文件中的头文件中包含此文件时,您就有了多个定义。当具有外部链接的同一对象标识符有多个定义时,C标准不定义行为。

当有多个常规定义时,构建工具会报告错误。然而,它们对待来自试探性定义的定义是不同的:它们允许它们,并将它们合并成一个定义。同样,这要归功于C语言开发和使用的历史。另外,GCC最近的这种行为也发生了变化。如上所述,在GCC版本10之前,默认情况下合并暂定定义。在GCC 10及更高版本中,试探性定义不合并,多个定义将导致错误。可以使用开关-fcommon请求旧行为。

为了避免暂定定义,您应该在头文件中将标识符声明为extern int my_var;,这只是一个声明,而不是暂定定义,并且您应该正好有一个包含int my_var = 0;的源文件,这是常规定义,而不是暂定定义。

其他信息为hereherehere

这篇关于C头文件中的全局变量初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆