一般在项目中想要定义一个变量可以被多个类进行访问,此时就可以定义全局变量。习惯上会将项目中所有类都用到的变量,集中定义在一个头文件中,使用时只需包含此头文件。但是对于我这样基础不牢靠的人,就犯了一个错误,而且当时怎么也没找到原因。
最后在别人的帮助下,得以解决。现记录一下。
#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
这个文件看似正常,实际上当在其它类中包含该头文件,编译项目时会出现下面的错误:
说是变量重定义,此时就很容易走偏。对于问题重定义的可能有以下几点:
- 头文件重复包含;
- 重名的变量被定义;
- 可能是编译生成的文件makefile中多编译了一遍;
- .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;