1 全域性變數(extern)
當兩個類都需要使用共同的變數,我們將這些變數定義為全域性變數。比如,res.h和res.cpp分別來宣告和定義全域性變數,類producerthread和consumerthread來使用全域性變數。
/**********res.h宣告全域性變數************/
#pragma once
#include const int g_ndatasize = 1000; // 生產者生產的總資料量
const int g_nbuffersize = 500; // 環形緩衝區的大小
extern char g_szbuffer; // 環形緩衝區
extern qsemaphore g_qsemfreebytes; // 控制環形緩衝區的空閒區(指生產者還沒填充資料的區域,或者消費者已經讀取過的區域)
extern qsemaphore g_qsemusedbytes; // 控制環形緩衝區中的使用區(指生產者已填充資料,但消費者沒有讀取的區域)
/**************************/
/**********res.cpp定義全域性變數************/
#pragma once
#include "res.h"
// 定義全域性變數
char g_szbuffer[g_nbuffersize];
qsemaphore g_qsemfreebytes(g_nbuffersize);
qsemaphore g_qsemusedbytes;
/**************************/
/**********類consumerthread使用全域性變數************/
#include "consumerthread.h"
#include "res.h"
#include 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 "《但是這樣做很不好,因為你無法使用#include "res.h"(使用它,若達到兩次及以上,就出現重定義錯誤;注:即使在res.h中加#pragma once,或#ifndef也會出現重複定義,因為每個編譯單元是單獨的,都會對它各自進行定義),那麼res.h宣告的其他函式或變數,你也就無法使用了,除非也都用extern修飾,這樣太麻煩,所以還是推薦使用.h中宣告,.cpp中定義的做法。
2 靜態全域性變數(static)
注意使用static修飾變數,就不能使用extern來修飾,即static和extern不可同時出現。
static修飾的全域性變數的宣告與定義同時進行,即當你在標頭檔案中使用static宣告了全域性變數,同時它也被定義了。
static修飾的全域性變數的作用域只能是本身的編譯單元。在其他編譯單元使用它時,只是簡單的把其值複製給了其他編譯單元,其他編譯單元會另外開個記憶體儲存它,在其他編譯單元對它的修改並不影響本身在定義時的值。即在其他編譯單元a使用它時,它所在的實體地址,和其他編譯單元b使用它時,它所在的實體地址不一樣,a和b對它所做的修改都不能傳遞給對方。
多個地方引用靜態全域性變數所在的標頭檔案,不會出現重定義錯誤,因為在每個編譯單元都對它開闢了額外的空間進行儲存。
注:一般定義static 全域性變數時,都把它放在.cpp檔案中而不是.h檔案中,這樣就不會給其他編譯單元造成不必要的資訊汙染。
3全域性常量(const)
const單獨使用時,其特性與static一樣(每個編譯單元中位址都不一樣,不過因為是常量,也不能修改,所以就沒有多大關係)。
const與extern一起使用時,其特性與extern一樣。
多個cpp檔案如何定義全域性變數與常量
寫比較複雜的c 時,我們往往會把 分成幾個片段放在幾個不同的cpp檔案中,這就引發了關於全域性常量 如pi的共享 和全域性變數的宣告與定義問題。假設我們有標頭檔案main.h和原始檔a.pp,b.pp 其中a.pp和b.pp都需要用到pi和乙個全域性常量size.那麼該如何定義呢?如果定義在main...
C 全域性變數的宣告與定義
1.header1.h中宣告全域性變數,header1.cpp中定義全域性變數 header1.h ifndef header1 h define header1 h extern int g n 標頭檔案中必須加extern宣告全域性變數,不賦值 int g o 錯誤 int g o 10 錯誤 ...
Vue 中如何定義全域性的變數和常量
我想要定義乙個變數,在專案的任何地方都可以訪問到,不需要每一次使用的時候,都引入.嘗試1 建立 global.js 並且在其中定義 let a 10 在入口檔案中引入 global.js import global.js 在專案中使用 a 報錯發現報錯了,a 並沒有定義.為什麼?這個涉及到模組作用域...