位置: 编程技术 - 正文

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

  • 开票的预收款怎么处理
  • 记账凭证核算形式是会计核算中最基本的核算形式
  • 公司借款受托支付是什么
  • 稳岗补贴计入现金流量哪个科目
  • 免费样品需要交印花税吗
  • 利用废旧物资生产设备
  • 出口退税收入做什么科目
  • 营改增后个人所得税计税依据实例
  • 咨询服务费没有发票
  • 企业所得税弥补亏损年限
  • 遗失发票如何处理
  • 2017年的7月1日
  • 清洁服务经营范围有哪些
  • 雇主责任险会计分录
  • 销售发票冲红的条件有哪些?
  • 增值税专用发票有效期是多长时间
  • 事业基金弥补收支差额
  • 租赁服务可以享受加计抵减吗
  • 存货发出记账成本最高
  • 个体户能给自己交五险吗
  • 系统备份工具
  • mac怎么连接蓝牙鼠标
  • 电脑中毒后如何不装系统清理掉
  • 保总保安服务有限公司
  • 成品油的消费税可以抵扣吗
  • 发生坏账计入
  • 克鲁格国家公园大雄狮视频大全
  • php执行脚本
  • 母子公司吸收合并税务处理
  • 用抵扣券买了东西可以退吗
  • 劳务费开发票后还需要交个税吗
  • php zend原理
  • 甲供材料总额法和差额法
  • 燃气管道安装费和暖气管道安装费两个的欠条怎么写
  • 税金及附加包括哪些
  • 长期股权投资的账面价值怎么计算
  • 施工项目的费用包括
  • 如何查看简易征信报告
  • 织梦官方网站
  • 处置长期股权投资其他综合收益结转
  • sqlserver存储过程写法
  • 税法中减除和减退的区别
  • 工程材料费发票没拿到是否能预提费用?
  • 自然人扣缴客户端恢复数据
  • 工商年报纳税总额从哪看
  • 其他应付款是什么类账户
  • 单位食堂用餐免费的账务处理
  • 文化事业建设费会计分录
  • 健身器材折旧年限及计提办法
  • 事业单位其他应付款核销分录
  • 建设工程项目设计阶段的投资控制方法有哪些
  • 已开票未收款如何销往来账
  • 公司挂靠有资质的企业公司会计处理?
  • 营业外支出增加说明了什么
  • 年度汇算清缴要补税怎么办
  • 原材料暂估的账务处理
  • 代开的专票作废了怎么做账?
  • 建立新公司需要做什么
  • 账本页面设置
  • 在mysql中,创建数据库的基本语法格式是
  • SQLServer XML查询18句话入门教程
  • Ubuntu16.04 server下配置MySQL,并开启远程连接的方法
  • linux统计重复次数
  • microsoft office诊断
  • 电脑打开win
  • win8.1使用
  • win10系统无法运行exe文件
  • windows8的ie浏览器在哪
  • Netlib.exe - Netlib是什么进程 有什么用
  • unity3d第三人称角色控制器
  • 使用jquery
  • 使用时间
  • activity启动流程图解
  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
  • vue中怎么引入css
  • jquery validator
  • 一起学下载软件
  • python遍历文件目录
  • 加格达奇税务局领导简介
  • 开票有什么好处吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设