位置: 编程技术 - 正文

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关机后usb还在供电
  • 财政拨付专项资金进什么会计科目
  • 苹果屏幕刷新率120hz的机型
  • vscode国内镜像
  • 委托境外研发费用加计扣除比例
  • 完税证明和纳税申报表的金额不一致
  • PHP:mcrypt_enc_is_block_algorithm()的用法_Mcrypt函数
  • PHP:mime_content_type()的用法_fileinfo函数
  • php中文出现乱码
  • 股东垫付款怎么处理
  • 利得是什么举个例子
  • 附有退回条件的销售商
  • php使用pdo连接数据库
  • 网络安全实验室
  • 拿到领料单如何做账
  • 增值税专用发票进项
  • 长期借款的处理原则
  • 海关缴款书当月能查到吗
  • 支付贷款利息属于筹资活动吗
  • 个人综合所得汇算申报流程
  • mongodb起源
  • sql server2005怎么打开
  • 基础电信服务和增值电信服务税率
  • 报销差旅费的进项税额
  • 企业管理费用科目期末一般是
  • 推迟确认收入的分析
  • 社会组织志愿者参观泉州华侨历史博物馆
  • 库存商品什么时候确认收入
  • 多计提的工资怎么调账
  • 增值税专用发票几个点
  • 收到公众号消息提醒
  • 税务自查补缴税款怎么办
  • 机动车转让后未过户原车主要承担赔偿责任
  • 收承兑汇票的利息怎么算
  • 电子承兑汇票是24小时签收吗
  • 借款归还时的收据填写
  • win8系统安装步骤
  • ubuntu没有wlan0
  • vmware安装macos10.15
  • centos7.2安装
  • win8 资源管理器
  • win8怎么设置桌面背景
  • linux命令csdn
  • win8声音小怎么解决
  • 请找到以下
  • node.js底层原理
  • 反序存放字符串
  • js随机生成6位数
  • 用持久的喷剂有副作用吗
  • Python通过行和列提取数据
  • js获取当前月份的天数
  • 辽宁省国家税务总局
  • Excel表格如何导出
  • 办真人cs场地需要什么资质
  • 土地增值税按什么价格
  • 城市配套费需要缴纳契税
  • ca如何办理退休手续办理流程
  • 地税纳税申报表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设