位置: 编程技术 - 正文

C++设置全局变量(c++全局变量赋值)

编辑:rootadmin
在一个.cpp(如a.cpp)中,在不属于任何类的地方,定义这个变量:int g_myvar;在一个.h文件中,如myglobal.h中,声明这个变量是extern的:extern int g_myvar; 在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编译单元生成的目标代码中找到此函数。(4)全局变量(extern) 有两个类都需要使用共同的变量,我们将这些变量定义为全局变量。比如,res.h和res.cpp分别来声明和定义全局变量,类ProducerThread和ConsumerThread来使用全局变量。(以下是QT工程代码)[cpp] view plaincopy/**********res.h声明全局变量************/ #pragma once #include <QSemaphore> const int g_nDataSize = ; // 生产者生产的总数据量 const int g_nBufferSize = ; // 环形缓冲区的大小 extern char g_szBuffer[]; // 环形缓冲区 extern QSemaphore g_qsemFreeBytes; // 控制环形缓冲区的空闲区(指生产者还没填充数据的区域,或者消费者已经读取过的区域) extern QSemaphore g_qsemUsedBytes; // 控制环形缓冲区中的使用区(指生产者已填充数据,但消费者没有读取的区域) /**************************/ 上述代码中g_nDataSize、g_nBufferSize为全局常量,其他为全局变量。[cpp] view plaincopy/**********res.cpp定义全局变量************/ #pragma once #include "res.h" // 定义全局变量 char g_szBuffer[g_nBufferSize]; QSemaphore g_qsemFreeBytes(g_nBufferSize); QSemaphore g_qsemUsedBytes; /**************************/ 在其他编译单元中使用全局变量时只要包含其所在头文件即可。[cpp] view plaincopy/**********类ConsumerThread使用全局变量************/ #include "consumerthread.h" #include "res.h" #include <QDebug> ConsumerThread::ConsumerThread(QObject* parent) : QThread(parent) { } ConsumerThread::ConsumerThread() { } ConsumerThread::~ConsumerThread() { } void ConsumerThread::run() { for (int i = 0; i < g_nDataSize; i&#;&#;) { g_qsemUsedBytes.acquire(); qDebug()<<"Consumer "<<g_szBuffer[i % g_nBufferSize]; g_szBuffer[i % g_nBufferSize] = ' '; g_qsemFreeBytes.release(); } qDebug()<<"&&Consumer Over"; } /**************************/ 也可以把全局变量的声明和定义放在一起,这样可以防止忘记了定义,如上面的extern char g_szBuffer[g_nBufferSize]; 然后把引用它的文件中的#include "res.h"换成extern char g_szBuffer[];。 但是这样做很不好,因为你无法使用#include "res.h"(使用它,若达到两次及以上,就出现重定义错误;注:即使在res.h中加#pragma once,或#ifndef也会出现重复定义,因为每个编译单元是单独的,都会对它各自进行定义),那么res.h声明的其他函数或变量,你也就无法使用了,除非也都用extern修饰,这样太麻烦,所以还是推荐使用.h中声明,.cpp中定义的做法。(5)静态全局变量(static) 注意使用static修饰变量,就不能使用extern来修饰,即static和extern不可同时出现。 static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了。 static修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其&#;复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的&#;。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。 多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。以下是Windows控制台应用程序代码示例:[cpp] view plaincopy/***********res.h**********/ static char g_szBuffer[6] = ""; void fun(); /************************/ [cpp] view plaincopy/***********res.cpp**********/ #include "res.h" #include <iostream> using namespace std; void fun() { for (int i = 0; i < 6; i&#;&#;) { g_szBuffer[i] = 'A' &#; i; } cout<<g_szBuffer<<endl; } /************************/ [cpp] view plaincopy/***********test1.h**********/ void fun1(); /************************/ [cpp] view plaincopy/***********test1.cpp**********/ #include "test1.h" #include "res.h" #include <iostream> using namespace std; void fun1() { fun(); for (int i = 0; i < 6; i&#;&#;) { g_szBuffer[i] = 'a' &#; i; } cout<<g_szBuffer<<endl; } /************************/ [cpp] view plaincopy/***********test2.h**********/ void fun2(); /************************/ [cpp] view plaincopy/***********test2.cpp**********/ #include "test2.h" #include "res.h" #include <iostream> using namespace std; void fun2() { cout<<g_szBuffer<<endl; } /************************/ [cpp] view plaincopy/***********main.cpp**********/ #include "test1.h" #include "test2.h" int main() { fun1(); fun2(); system("PAUSE"); return 0; } /************************/ 运行结果如下: 按我们的直观印象,认为fun1()和fun2()输出的结果都为abcdef,可实际上fun2()输出的确是初始&#;。然后我们再跟踪调试,发现res、test1、test2中g_szBuffer的地址都不一样,分别为0xa、0xa、0xa,这就解释了为什么不一样。 注:一般定义static 全局变量时,都把它放在.cpp文件中而不是.h文件中,这样就不会给其他编译单元造成不必要的信息污染。(6)全局常量(const) const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)。 const与extern一起使用时,其特性与extern一样。[cpp] view plaincopyextern const char g_szBuffer[]; //写入 .h中 const char g_szBuffer[] = ""; // 写入.cpp中

推荐整理分享C++设置全局变量(c++全局变量赋值),希望有所帮助,仅作参考,欢迎阅读内容。

C++设置全局变量(c++全局变量赋值)

文章相关热门搜索词:c++全局变量赋值,c++ 全局变量,c++中全局变量的用法,c++全局变量和局部变量,c++如何设置全局变量,c++如何设置全局变量,c++全局变量在哪里定义,c++全局变量在哪里定义,内容如对您有帮助,希望把文章链接给更多的朋友!

JOGL测试 JOGL是JAVA通过JNI的方式调用OpenGL的封装。给出一个简单Demo(所需依赖,不是最小依赖,有多余的jar和DLL)1、环境配置依赖jar包:指定native库工程配置和javac

opengl中使用顶点数组的方法 #includeGL/glut.h#includestdlib.h#includestdio.h#ifdefGL_VERSION_1_1#definePOINTER1#defineINTERLEAVED2#defineDRAWARRAY1#defineARRAYELEMENT2#defineDRAWELEMENTS3intsetupMethod=POINTER;//intderefMethod=D

OpenGL学习入门之VS环境配置 OpenGL开发环境简介基于OpenGL标准开发的应用程序运行时需有动态链接库OpenGL.DLL、Glu.DLL,这两个文件在安装WindowsNT时已自动装载到C:WINDOWSSYSTEM目

标签: c++全局变量赋值

本文链接地址:https://www.jiuchutong.com/biancheng/368425.html 转载请保留说明!

上一篇:4.2 模型变换和视图变换(模型变量是什么)

下一篇:JOGL测试(j-v测试)

  • 车辆购置税的税率是多少
  • 资源税征收原则
  • 采购商品的会计分录料未到票到
  • 利息调整的计算公式
  • 收款凭证填写模板下载
  • 外汇税收怎么缴纳增值税
  • 跨月的普票怎么作废从系统里作废
  • 全资子公司向母公司划转资产 土地增值税
  • 代订机票款发票可以作为机票报销差旅吗
  • 租赁房产不开租房发票
  • 费用结转到本年利润是手动还自动结转?
  • 自助设备使用费会计科目
  • 制造费用计入期间费用吗
  • 进口增值税计入关税完税价格吗
  • 其他税收收入包括
  • 期初未缴税额和期末未缴税额
  • 包工包料装修
  • 现金折扣通过财务费用核算
  • 个人去税务局开租房发票需要缴纳多少税点
  • 计算机网络默认网关什么意思
  • 格拉斯伯格
  • 育空怀特霍斯附近的北极光,加拿大 (© Design Pics/Danita Delimont)
  • 前端向后端传值的函数
  • 会计准则新规
  • php请求https
  • 退休返聘人员算临时工吗
  • 一个简单的小实验
  • 电子税务局附加税退税在哪看
  • 所得税费用要结转损益吗
  • 铁路运输费发票备注栏必填吗
  • 工业企业采购部工作职责
  • 当月勾选认证可以在下月抵扣吗
  • 劳务派遣申报表附表一怎么填
  • 出租厂房会计分录怎么写
  • 织梦如何使用
  • 社保工伤退回分录
  • 存货包括材料成本吗
  • 增值税抵扣环节
  • 直接计入所有者权益的利得和损失
  • 企业所得税预缴申报表
  • 异常凭证一定要转出吗
  • 本期盈余转入累计盈余
  • 企业合并财务报表
  • 购买汽车轮胎的注意事项
  • 公司开业两年后辞职
  • 应收账款有什么
  • 当月开具的专票可以当月抵扣吗
  • 固定资产折旧方法不考虑净残值
  • 试算平衡表的编制方法
  • 管理费用通俗理解
  • 一年以内到期的长期借款属于
  • 施工图审查费计入什么会计科目
  • 期间费用包括哪些费用
  • 什么是权责发生会计处理基础
  • 房地产开发企业销售自行开发的房地产项目
  • 系统win10安装
  • windows 2008
  • solaris更改文件权限
  • 方正笔记本
  • 退休后归什么部门管
  • linux 详解
  • slee81.exe - slee81是什么进程
  • windows 10预览版
  • 联想安装xp系统
  • mac系统崩溃怎么重装系统
  • myminer.exe是什么
  • ExtJS 2.0实用简明教程 之Border区域布局
  • js文件里面有什么
  • js基于什么
  • unity编辑工具软件介绍
  • linux查看shell脚本内容
  • androidapplication
  • springmvc返回json格式的注解
  • 亲测源码论坛
  • 湖北税务官方网
  • 四川省地方税务局关于城镇土地使用税困难减免
  • 农村饮水扶持资金申请报告
  • 国家税务网站官网
  • 补贴收入有哪些
  • 注册会计师和注册审计师哪个厉害
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设