位置: 编程技术 - 正文

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测试)

  • 金税盘连接不上电脑是怎么回事
  • 现金流量套期与什么无关
  • 普通发票开折扣销售能冲减销售吗
  • 初始数据录入后怎么修改
  • 企业购买的黄金计入什么科目
  • 逾期增值税扣税凭证抵扣问题
  • 汽车修理费入账
  • 工商营业执照变更流程
  • 替票和代票的区别是什么
  • 个人所得税成本费用包括哪些
  • 房地产开发企业什么意思
  • 在建工程抵工程款
  • 个独企业如何拿钱
  • 所得税申报表中的营业成本包括费用吗
  • 增值税普通发票税率
  • 建筑公司工地买空调
  • 房屋维修费属于固定资产吗
  • 应收账款转营业外收入怎么写申请
  • 原本可以打开的软件
  • win10玩游戏时弹出error
  • windows10如何开启夜间模式
  • 摊余成本计量的金融资产账面价值
  • 房屋装修费如何入账
  • 委托去银行办理业务的委托书
  • 营业外收入增加说明什么问题
  • php imagestring
  • 短期投资计入什么科目
  • 带薪缺勤会计分录
  • chattr
  • 小微企业普惠性税收减免政策2022
  • 一般纳税人两费附加减免规定
  • 可以抵扣土地增值税的项目
  • 如何理性看待国企改革
  • 注册资本增加了怎么做账
  • 润滑油一般纳税人税率是多少
  • 核定征收的方式包括
  • 唐山发生5.1级地震
  • web cms漏洞
  • ps高反差保留怎么弄
  • SQLite3 命令行操作指南
  • 怎么防止?
  • 所得税汇算清缴怎么操作
  • 成本费用利润率越高越好吗
  • 城建税和教育费附加地方教育费附加税率
  • mysql用户权限详解
  • 现时社保缴费
  • 公对公转账在手机上怎么操作
  • 印花税申报成功未扣款还能更正吗
  • 公司没有车加油费怎么报
  • 主营业务收入借方什么意思
  • 暂估入库后发票整单折扣
  • 工会年末结余会计分录
  • 小微企业可以享受六税两费吗
  • 对方开的增值税普票怎么查
  • 收取加盟费的账户是什么
  • 用友t3计提折旧了没有生成凭证
  • 收到票据又转背书付了账务处理
  • 银行回单模板
  • 应付票据贴现利息收入会计分录
  • 应付账款账户怎么结转
  • 会计账簿按用途分类可以分为
  • sql server 2000安装包
  • java连接mysql数据库教程
  • win10预览版好吗
  • logo是什么文件夹
  • win7如何彻底关闭135端口 dcom
  • windowsxp查ip地址
  • linux php教程
  • linux中管道
  • linux用
  • c#多线程应用
  • opengl 画线
  • 你将会收藏
  • linux反弹shell方法
  • javascript怎么学
  • javascript函数的定义
  • android源码下载地址
  • 上海个人到税务局怎么开票
  • 亦庄地税局税务局营业大厅
  • 在网上购物是否隔断时间就要实名
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设