C 全域性常量與變數的定義方法

2021-07-10 12:17:55 字數 2268 閱讀 3877

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來修飾,即staticextern不可同時出現。

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 並沒有定義.為什麼?這個涉及到模組作用域...