EasyC++全局变量

 更新时间:2021年12月17日 09:19:13   作者:梁唐  
这篇文章主要介绍了EasyC++全局变量

文章转自公众号:Coder梁(ID:Coder_LT)

全局变量:

前面聊到了静态持续变量的链接性,其中链接性为外部的变量通常简称为外部变量。它们的存储持续性为静态,作用域为整个程序。外部变量是在函数外部定义的,因此对于所有的函数而言都是外部的。因此外部变量也被称为全局变量。

关于外部变量,C++当中有一个单定义规则:变量只能有一次定义。

这句话看起来有些难以理解,为了理解它,我们需要厘清C++当中的两种变量声明。一种是定义声明简称为定义,它给变量分配存储空间。另外一种是引用声明,简称为声明,它不给变量分配存储空间。因为它表示引用一个已有的变量。

引用声明使用关键字extern,并且不进行初始化。否则会被视为是定义,而非声明。

double up;
extern int blue;
extern char ch = 'z';


上面的例子当中,第一行和第三行为定义声明,因为第一行没有加关键字extern,而第三行的变量进行了初始化。

可能到这里还是有些难以理解,其实extern是为了引入其他文件创建的变量。如果我们不加extern,表示在当前文件当中创建一个全局变量,而加上了extern表示引入其他文件创建的全局变量。外部链接性的全局变量虽然是整个程序都可使用的,但跨文件使用时,需要手动使用extern声明。

没有通过extern声明的其他文件的全局变量也是无法使用的。

当我们同时使用局部变量和全局变量的时候会发生什么呢?比如下面这段代码:

// file1
double warning = 3.0;

// file2

extern double warning;

void test() {
    double warning = 5.0;
    cout << warning << endl;
}

在这段代码当中, 我们在file1中创建了变量warning,在file2当中声明了这个全局变量。并且在test函数当中又定义了一个新的double类型的变量也叫做warning,那么问题来了,当我们使用cout输出的时候,究竟得到的结果会是什么呢?

答案很简单,得到的结果是5.0。因为当同时使用同名的局部变量和全局变量时,局部变量将隐藏全局变量。

那么全局变量和局部变量究竟应该使用哪一种呢?

很明显,全局变量非常方便,使用全局变量可以免去很多参数传递的过程,大大简化了编码的难度。但如果是在大型的工程当中,使用全局变量则是一个非常危险的行为。因为全局变量人人都能访问,我们很难保证数据的准确性,会不会遭遇不可知的更改,排查的时候也更加困难。而使用局部变量,参数传递的链路是清晰的,debug的时候会容易许多。

在我们日常的算法联系当中,并不存在数据不可靠的问题。使用全局变量可以简化许多数据结构的实现过程,尤其是一些相对复杂的数据结构。我认识的所有算法竞赛的大牛,都非常喜欢使用全局变量。所以到底该用哪个并不是固定的,要根据我们的实际需要进行选择。

到此这篇关于EasyC++全局变量的文章就介绍到这了,更多相关C++全局变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解C++中的类型转化

    一文详解C++中的类型转化

    说起类型转化,我们在C语言之前的学习中可以了解到,类型转换可以分为两种情况:隐式类型转化;显示类型转化。但是为什么在c++中还要继续对类型转化做文章呢?我们一起来看
    2023-04-04
  • C++单例模式的几种实现方法详解

    C++单例模式的几种实现方法详解

    这篇文章主要为大家详细介绍了C++单例模式的几种实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现推箱子小游戏源码

    C++实现推箱子小游戏源码

    这篇文章主要为大家详细介绍了C++实现推箱子小游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 判断一个数是不是素数的方法

    判断一个数是不是素数的方法

    判断一个数是不是素数的方法,需要的朋友可以参考一下
    2013-03-03
  • 利用C++ R3层断链实现模块隐藏功能

    利用C++ R3层断链实现模块隐藏功能

    在R3层的模块隐藏,我们需要做的就是将其该链表断链,将某一模块从这个双向链表中摘除,这样再调用传统的API时就会搜索不到。本文重点给大家介绍利用C++ R3层断链实现模块隐藏功能,感兴趣的朋友一起看看吧
    2019-10-10
  • stl容器set,map,vector之erase用法与返回值详细解析

    stl容器set,map,vector之erase用法与返回值详细解析

    在使用 list、set 或 map遍历删除某些元素时可以这样使用,如下所示
    2013-09-09
  • c++实现一个简易的网络缓冲区的实践

    c++实现一个简易的网络缓冲区的实践

    这篇文章主要介绍了c++实现一个简易的网络缓冲区的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C语言学生成绩管理系统课程设计word版

    C语言学生成绩管理系统课程设计word版

    这篇文章主要为大家详细介绍了C语言学生成绩管理课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++用easyx图形库实现障碍跑酷小游戏

    C++用easyx图形库实现障碍跑酷小游戏

    这篇文章主要为大家详细介绍了C++用easyx图形库实现障碍跑酷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Objective-C不带加减号的方法实例

    Objective-C不带加减号的方法实例

    显而易见的事实是,Objective-C 中,+ 表示类方法,- 表示实例方法,这篇文章主要给大家介绍了关于Objective-C不带加减号的相关资料,需要的朋友可以参考下
    2021-06-06

最新评论