一般在项目中想要定义一个变量可以被多个类进行访问,此时就可以定义全局变量。习惯上会将项目中所有类都用到的变量,集中定义在一个头文件中,使用时只需包含此头文件。但是对于我这样基础不牢靠的人,就犯了一个错误,而且当时怎么也没找到原因。
最后在别人的帮助下,得以解决。现记录一下。

#ifndef DATASET_H
#define DATASET_H#include <QMutex>
#include <QWaitCondition>
//#include <QVector>
#include <QQueue>#define MaxSize 300
#define CurrentN 0
#define ExpectedN 500static uint32_t maxStoreNum = MaxSize;//最大存储量
static uint32_t  currentNum = CurrentN;//当前存储量
static uint32_t  preStoreNum = ExpectedN;//预计存储量500QQueue<quint8> queue;QMutex mutex;
QWaitCondition fullCondition;//消费者等待不为空(消费太快)
QWaitCondition emptyCondition;//生产者等待为空(生产太多)#endif // DATASET_H

这个文件看似正常,实际上当在其它类中包含该头文件,编译项目时会出现下面的错误:

说是变量重定义,此时就很容易走偏。对于问题重定义的可能有以下几点:

  1. 头文件重复包含;
  2. 重名的变量被定义;
  3. 可能是编译生成的文件makefile中多编译了一遍;
  4. .pro文件在源文件中多包含了一遍。
    反复查看,终不得果。究其原因是因为头文件定义的全局变量有问题,造成了多次定义。正确的写法是:

头文件中定义全部变量,需要在变量前添加关键字extern声明变量,然后再在.cpp文件中定义变量。

所以正确的写法是:
DataSet.h

#ifndef DATASET_H
#define DATASET_H#include <QMutex>
#include <QWaitCondition>
//#include <QVector>
#include <QQueue>#define MaxSize 300
#define CurrentN 0
#define ExpectedN 500static uint32_t maxStoreNum = MaxSize;//最大存储量
static uint32_t  currentNum = CurrentN;//当前存储量
static uint32_t  preStoreNum = ExpectedN;//预计存储量500extern QQueue<quint8> queue;extern QMutex mutex;
extern QWaitCondition fullCondition;//消费者等待不为空(消费太快)
extern QWaitCondition emptyCondition;//生产者等待为空(生产太多)#endif // DATASET_H

DataSet.cpp

#include "DataSet.h"QQueue<quint8> queue;
QMutex mutex;
QWaitCondition fullCondition;
QWaitCondition emptyCondition;

Qt中全局变量的使用相关推荐

  1. QT中使用全局变量在多个源程序中传递变量

    使用QT5.5开发一个程序,有时需要多个源文件,包括若干个头文件和若干个定义文件.因此如何在多个源程序间开发传递变量就成了一个关键问题.一般来说在多个源程序间传递变量大概有两种方法: 一.是将全局变量 ...

  2. Qt 中使用全局变量的方法

         Qt中,经常会出现一个工程下面多个.cpp文件都需要调用或者改变某一个变量的问题,这个时候往往有两种解决办法:第一种是利用信号与槽的机制,第二种方法就是利用全局变量.下面着重说一下第二种:  ...

  3. Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法

    一 前言 二Qt多线程方法一 继承QThread 2.1使用多线程的原因分析 2.2 写一个继承于QThread的线程 三 总结 一 前言   本篇文章部分内容参考了该博文:传送门.   Qt中有两种 ...

  4. C++中运行一个程序的内存分配情况及qt中的内存管理机制

    一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一 ...

  5. c#,c++,qt中多线程访问UI控件线程的问题汇总

    c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件. c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke ...

  6. Qt中mouseMoveEvent(QmouseEvent *event)使用探讨

    Qt中mouseMoveEvent(QmouseEvent *event)使用探讨 在学习网络教程过程中,尝试使用Qpainter制作一个涂鸦板,需要使用QmouseEvent ,按照教程,涂鸦板不能 ...

  7. 在QT中使用socket编程:解决connect函数名称冲突

    问题 当使用QT做可视化界面的时候,我们知道connect函数是连接函数,用于连接信号与槽,但connect在C/C++的socket网络编程中也是一个必不可少的函数,作用是发送连接请求,建立tcp连 ...

  8. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

  9. QT 中使用 OpenCv 的 CascadeClassifier 报错

    问题 在 QT 中调用 OpenCv 的 CascadeClassifier 进行人脸框检测的时候,在构造函数中进行检测器的初始化,随后调用相机读取图片的时候就会报错,报的错误是 Segment Fa ...

最新文章

  1. keras lstm 层理解
  2. Java中HashMap、LinkedHashMap和TreeMap区别使用场景
  3. Java之static的内容
  4. ansys变形太夸张_ANSYS大变形典例:线性与非线性分析差别巨大,如何选择?
  5. mac根目录无法新建文件夹
  6. 自动化测试 之连连看外挂项目实战
  7. C++:error 2048:函数*****已有主体
  8. 2.1 A k-armed Bandit Problem
  9. 教育界杂志教育界杂志社教育界编辑部2022年第24期目录
  10. TI M3554 omap_i2c omap_i2c.2: controller timed out 问题查找与解决
  11. 数学不好能学计算机编程吗,数学很差能学计算机吗 有哪些窍门
  12. “麒麟计划”即时响应国家政策,发力数字营销助推二手车出口贸易
  13. MyBatis从入门到精通 PDF 完整版
  14. 关于查询报表总是“超时已过期“的问题解决
  15. EOJ #3452 唐纳德先生和假骰子【暴力】
  16. GD32VF103_DAC
  17. Kotlin Bootcamp 自学(2):Kotlin基础
  18. 【matplotlib】如何进行颜色设置选择cmap
  19. 路透:香港金管局要求银行收紧对中国内地企业的贷款
  20. js获取本机mac地址,IP地址

热门文章

  1. 重磅官宣:Nacos2.0发布,性能提升10倍
  2. 宜家:打造新零售时代的智能客户身份管理系统
  3. 集群e家:O2O电商服务平台上云
  4. 编码规范 | Java函数优雅之道(上)
  5. 重磅公开!阿里语音识别模型端核心技术,让你“听”见未来
  6. 服务实体经济、战略级行业再下一城,钉钉发布制造行业解决方案2.0
  7. 运维质变育新机,华为云能否引领政企运维破局?
  8. “智汇光大 E启未来” 中国光大集团ESBU协同核心系统1.0正式发布
  9. 「今天沾一口野味,明天地府相会!」AI如何抗击「野味肺炎」
  10. IT公司刻板印象合集:程序员都秃头,商务个个是人精