一般在專案中想要定義乙個變數可以被多個類進行訪問,此時就可以定義全域性變數。習慣上會將專案中所有類都用到的變數,集中定義在乙個標頭檔案中,使用時只需包含此標頭檔案。但是對於我這樣基礎不牢靠的人,就犯了乙個錯誤,而且當時怎麼也沒找到原因。
最後在別人的幫助下,得以解決。現記錄一下。
#ifndef dataset_h
#define dataset_h
#include
#include
//#include
#include
#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 queue;
qmutex mutex;
qwaitcondition fullcondition;
//消費者等待不為空(消費太快)
qwaitcondition emptycondition;
//生產者等待為空(生產太多)
#endif
// dataset_h
這個檔案看似正常,實際上當在其它類中包含該標頭檔案,編譯專案時會出現下面的錯誤:
說是變數重定義,此時就很容易走偏。對於問題重定義的可能有以下幾點:
標頭檔案重複包含;
重名的變數被定義;
可能是編譯生成的檔案makefile中多編譯了一遍;
.pro檔案在原始檔中多包含了一遍。
反覆檢視,終不得果。究其原因是因為標頭檔案定義的全域性變數有問題,造成了多次定義。正確的寫法是:
標頭檔案中定義全部變數,需要在變數前新增關鍵字extern宣告變數,然後再在.cpp檔案中定義變數。所以正確的寫法是:
dataset.h
#ifndef dataset_h
#define dataset_h
#include
#include
//#include
#include
#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 queue;
extern qmutex mutex;
extern qwaitcondition fullcondition;
//消費者等待不為空(消費太快)
extern qwaitcondition emptycondition;
//生產者等待為空(生產太多)
#endif
// dataset_h
dataset.cpp
#include
"dataset.h"
qqueue queue;
qmutex mutex;
qwaitcondition fullcondition;
qwaitcondition emptycondition;
QT中全域性變數的定義
多的就不說了,本來就是乙個簡單地內容,只是不會的話會很頭疼 我們首先新建兩個檔案,檔名可以自定義,我們在這裡定義為variate.h 和 variate.cpp 當然了,字尾是不能變的。和函式一樣,我們在variate.h中對全域性變數進行宣告,注意,extern 是不能遺漏的 ifndef var...
QT全域性變數宣告及使用
1.先在乙個.h檔案中宣告乙個類 ifndef data h define data h class data endif 2.在.cpp檔案裡類中的成員進行定義 include data.h int data flag 0 int data size 5 3.只要有了前面兩步,這些變數就可以在其他...
Qt中使用全域性變數的例項
在qt中使用全域性變數的例項 1.首先需要在乙個標頭檔案中對全域性了變數使用exern方法進行定義。extern char teststr 2.只能在cpp檔案中對其是例項化,並且例項化只能在函式的外部進行。建議在包含main函式的cpp檔案中進行例項化,這樣可以確保在其他檔案中使用時,它已經被例項...