位置: 编程技术 - 正文

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

  • 运输开票的税点是多少
  • 无偿使用场地涉及的问题
  • 企业合并吸收税务处理
  • 库存商品属于资产类会计科目吗
  • 个人社保缴费多少钱一个月
  • 建行网银转账复核流程
  • 产权转移书据印花税分录
  • 设计原始凭证所需内容及步骤
  • 异地成立分公司
  • 收到销售退回时应当冲减
  • 建筑业营改增的主要内容
  • 出租不动产房屋交什么税
  • 股息交个人所得税怎么交
  • 收回多缴税金会计分录
  • 偶然所得个税怎么计算公式
  • 现金股利和股票股利的区别
  • 房地产按揭贷款是什么意思
  • 员工对公司造成损失的,可以起诉吗
  • 以前年度少计提工资的会计处理
  • 一般纳税人销售自己使用过的物品
  • 2020退税时间超过了怎么办
  • 专用发票与普通发票代码区别
  • 港口建设费2021年归国家税务总局
  • 怎么查询财务章备案信息
  • 收到汽车保险赔款怎么做账
  • 海关专用缴款书怎么认证?
  • 电子发票怎么打成A4纸一半
  • 免征的税款每月几号申报
  • 出口退税的钱退到哪里了
  • windows10如何开启远程
  • 股息红利需要缴纳个税吗
  • 跨年度增值税发票作废怎么退税
  • 电脑bios怎么设置网络启动
  • 开发商未出售的房子有产权证吗
  • win10蓝屏错误怎么办
  • 无序树有几种
  • 如果工地老板拖欠工资怎么办
  • 让劳务公司代发工资
  • 职称评审费计入什么科目
  • 对其他公司的建议
  • 深红玫瑰鹦鹉多钱一个
  • 自然人股东是
  • 计提房产税会计分录怎么做账
  • php正则函数内容匹配
  • typescript instanceof
  • 基于个人同意处理个人信息的个人什么撤回其同意
  • mdadm命令详解
  • 图书为什么不能退货
  • 台账如何做到表中分好几个表
  • 印花税怎么计提记账
  • 单位销售收入不包括哪些
  • 清理扬声器
  • mysql锁表机制
  • 财政拨款方式有哪几种
  • sqlserver有实例吗
  • 其他应收款余额在贷方什么意思
  • 开具正数发票中如何体现扣款?
  • 分红做什么会计分录
  • 公司的进账能打到私人卡上
  • 信用减值损失科目代码6702
  • 职工医保门诊一年报销多少钱
  • 营改增后建筑业增值税税率
  • 应收账款属于流动负债项目吗
  • linux防御
  • hipo.dll是什么
  • win7系统怎么给软件打开摄像头权限
  • 解决VMware下64位linux系统不支持全虚拟化的办法
  • windows10电脑声音
  • linux下VSFTP 530 Permission denied错误的解决办法
  • ansi std
  • 只有一行的矩阵的逆矩阵
  • node.jsexpress
  • javascript基础书
  • jquery修改css
  • 人力资源差额发票
  • 地税申报网站
  • 车辆退款
  • 支付宝申领失业金申请审核多久
  • 深圳增值税勾选平台网址
  • 国家税务总局网站官网贵州省税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设