Qt中全局变量的使用

本文记录了一位开发者在项目中遇到的全局变量重定义问题。由于在头文件中直接定义了全局变量,导致在包含该头文件的多个类中出现编译错误。解决方案是使用extern关键字在头文件中声明变量,在单独的cpp文件中定义。这确保了全局变量只被定义一次,避免了重复定义的问题。
摘要由CSDN通过智能技术生成

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

#ifndef DATASET_H
#define DATASET_H

#include <QMutex>
#include <QWaitCondition>
//#include <QVector>
#include <QQueue>

#define MaxSize 300
#define CurrentN 0
#define ExpectedN 500

static uint32_t maxStoreNum = MaxSize;//最大存储量
static uint32_t  currentNum = CurrentN;//当前存储量
static uint32_t  preStoreNum = ExpectedN;//预计存储量500

QQueue<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 500

static uint32_t maxStoreNum = MaxSize;//最大存储量
static uint32_t  currentNum = CurrentN;//当前存储量
static uint32_t  preStoreNum = ExpectedN;//预计存储量500

extern 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值