全局变量的使用方法

参考链接:https://www.cnblogs.com/Dageking/p/3185230.html  https://blog.csdn.net/hi_baymax/article/details/82425457

强烈建议使用xxx.h和xxx.cpp的形式创建全局变量和全局函数。.h和.cpp分别来声明和定义全局变量。此处建议,.h文件最好只写变量和函数的声明,不要将定义也写到.h文件中,避免出现重复定义的现象,将变量和函数的定义写到.cpp文件中。

建议将所有的全局变量都放到一个编译单元(即一个.h和.cpp文件)中,这样会显的简洁明了。

参考形式如下:

全局变量的头文件形式如下:

//************************************************************************//
/**********MyGlobalValue.h声明全局变量************///* 定义各种类型的全局变量
//************************************************************************//#pragma once//22声明枚举来(舞蹈类型)enum DanceType{BIEGU_BTN,XIONGGU_BTN,YANGGE_BTN,YAOGU_BTN,NULL_BTN};extern DanceType enumBtnType;extern DanceType enumBtnType_LastFrame;//22声明结构体
struct fPOINT{float x, y;};
extern fPOINT fRightPoints[25];//22声明其他常用变量
extern  char serverIP[20] ;
extern  int g_INT;
extern float g_fGMsetTM1;    //22
extern bool g_bBTN_Timeflag;   //22//22声明全局函数
int Add(int a,int b);              //22 加法

全局变量的源文件形式如下:

#include "StdAfx.h"
#include "MyGlobalValue.h"//22定义枚举来(舞蹈类型)DanceType enumBtnType=NULL_BTN;DanceType enumBtnType_LastFrame=NULL_BTN;//22定义结构体fPOINT fRightPoints[25]={};//22定义其他常用变量
char serverIP[20] ={0};
int g_INT=10;
float g_fGMsetTM1=5.0f;    //22
bool g_bBTN_Timeflag=false;//22定义全局函数
int Add(int a,int b)
{  int nAddResult=a+b;return nAddResult;
}

调用全局变量的方法,调用时只需要导入头文件即可调用,参考如下:

将MyGlobalValue.h头文件添加到stdafx.h文件中,以方便用所有编译单元调用

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//#pragma once#include "targetver.h"#include <stdio.h>
#include <tchar.h>#include "MyGlobalValue.h"// TODO: 在此处引用程序需要的其他头文件
#include "stdafx.h"
//此处将“#include "MyGlobalValue.h"” 写到stdafx.h中,以方便共所有编译单元调用int _tmain(int argc, _TCHAR* argv[])
{/******通过导入别的编译单元的头文件的方式来调用全局变量**********/g_INT=20;num=2+20;printf("定义、声明分别在.h .cpp文件中的全局变量调用结果:%d\n",num);return 0;
}

注: 定义static 全局变量时,建议把它放在需要用的编译单元的.cpp文件中而不是.h文件中,这样就不会给其他编译单元造成不必要的信息污染 。如下代码中的gT_staticDefineINT变量。

#include "StdAfx.h"
#include "B.h"//22声明&定义静态全局变量static int gT_staticDefineINT=0;
B::B(void)
{m_vable=0;
}B::~B(void)
{
}
int B::UseGlobalVariable(int a,int b)//22调用全局变量
{int c=0;c=a+b+g_INT;return c;
}

下面就是为什么这么建议的理由,结合两位前辈的文章,总结如下:

建议的理由

基础知识了解

(1)编译单元(模块)

  在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:

  第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件;

  第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件。

  那么,错误可能在两个地方产生:

  一个,编译时的错误,这个主要是语法错误;

  一个,链接时的错误,主要是重复定义变量等。

  编译单元指在编译阶段生成的每个obj文件。

  一个obj文件就是一个编译单元。

  一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。

  一个工程由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等。

(2)声明与定义

函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;

函数或变量在定义时,它就在内存中有了实际的物理空间。

如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。

函数或变量可以声明多次,但定义只能有一次。

(3) extern作用

作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。

作用二:当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。

即B编译单元要引用A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头文件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。

静态全局变量与全局变量的区别

全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上没有什么不同。区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。

static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。

注:一般定义static 全局变量时,都把它放在.cpp文件中而不是.h文件中,这样就不会给其他编译单元造成不必要的信息污染。

以上是自己的感悟总结,如有不妥之处,欢迎指正,共进步。

C++ 全局变量及静态全局变量的使用方法相关推荐

  1. 全局变量、静态全局变量、静态局部变量和局部变量的区别

    static和const都是C++中比较麻烦的东西,只要是太容易混淆他们的作用,之前对static做过点总结,但是不全面,还有很多小的错误,现在整理一下: 变量可以分为:全局变量.静态全局变量.静态局 ...

  2. 全局变量与静态全局变量

    1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量. 2)全 ...

  3. 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分:全局变量.静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区 按作用域分: 1.全局变量在整个工程文件内都有效: 2.静态全局变量只在定义它的文件内有效: 3. ...

  4. C++全局变量,静态全局变量,不加修饰符的全局变量

    1.C++全局变量一般指extern全局变量,作用域:多个文件 使用方式:.h声明全局变量 extern int a; 对应.cpp文件定义全局变量 int a=1; 其他cpp文件使用全局变量 if ...

  5. c语言静态变量与局部变量,C语言 全局变量、静态全局变量、局部变量、静态局部变量...

    //test.c #include extern int global_var; void test_global_var() { global_var++; printf("global_ ...

  6. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  7. 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)...

    我们先来看内存中的几大区:  内存到底分几个区? 下面有几种网上的理解,我整理一下: 一: 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构 ...

  8. 【C语言局部变量/静态局部变量/全局变量与静态全局变量

    1基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...

  9. C语言全局变量(c文件和h文件中的全局变量、静态全局变量)使用注意事项

    C语言在头文件中包含全局变量有三种形式: 1 在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值. 如在main.c定义 int a ...

最新文章

  1. 虽然这些代码很少,就几行,但却很牛逼!
  2. Poj 2887-Big String Splay
  3. suse mysql root密码忘记_SUSE11.4 找回 mysql root 密码?网上能找到的所有方法都试过了,不行......
  4. apex图表使用饼图居中_ppt图表技巧:如何制作美观简洁的百分比饼图
  5. php和python交互-Python如何实现简单的用户交互程序(示例)
  6. spark学习:ContextCleaner清理器
  7. AutoFac自动注入时报错
  8. excel学习1-查看一列数值是否在另一列中存在
  9. win10睡眠按啥键唤醒_防止Windows10自动唤醒,就用这4招,维修电脑必知
  10. Spring Boot整合Swagger3
  11. windows server 2012将计算机图标添加到桌面(图文教程)(转)
  12. 关于2020新版idea,maven工程依赖成功导入、但运行找不到jar包问题解决。
  13. java后台通用权限管理系统(springboot)
  14. linux锐捷代码_Linux下锐捷上网操作
  15. winen中文_win10中文语言包下载|
  16. Paper--3d reconstruction:Photo Tourism: Exploring Photo Collections in 3D
  17. 运营 | 抖音运营12个步骤
  18. 内网通过代理服务器访问高德地图服务的方法
  19. HTML吸引人眼球的网页,优秀网页设计:35个吸引眼球的精美作品集网站
  20. 十进制转换为二进制、原码、反码、补码、移码

热门文章

  1. 五脏六腑在脸上的反射区图片_内脏在脸上的反射区图片
  2. 新媒体培训的目的和意义体现
  3. Linux ls指令
  4. 2020-05-19:催收核心业务是什么?
  5. IDEA编译器快捷键
  6. 常见服务器的状态码有哪些
  7. 物联网 | NB-IoT与LoRa简介
  8. CSDN周赛第39期题解
  9. mysql数据库健康诊断_MySQL 慢的诊断思路
  10. int函数与float函数的区别以及print的作用