Re: [問題] global structure?
extern 有很多種用法。
簡單地說,extern 只作一個「宣稱」的動作,並不產生變量的實體。
所以通常是用來處理 global 變量(物件),例如:
// File1.h
extern int global_val;
// File1.c
int global_val = 123;
這樣任何 include "File1.h" 的模組都可以直接操作 global_val;
但由於 C/C++ 規定使用 extern 宣告的變量,只需要剛好有一份實體
即可,沒有限制一定要放在同一個模組,所以事實上也可以這樣使用:
// File2.c
int val = 456;
// File3.c
extern int val;
即使 File3 模組與 File2 模組沒有任何關係,只要經過 extern 宣告
在 File3 模組內就可以操作到 val,當然,val 變量的實體必須剛好
只有一份。
可以看見,明明 File2.c 沒有被任何其他模組使用到,但只要通過
extern,就可以輕易破壞封裝性。
因此,為了避免 global 變量不小心被跨轉譯單元誤用,即使它的宣告和
定義都是放在 .c 或 .cpp (也就是不在 .h 或 .hpp 宣告它),保險的
作法是以關鍵字 static 或者不具名的 namespace 給它強制:
// File2.c
static int val = 456; // C 語言
或者
namespace
{
int val = 456; // C++
}
這樣一來,就限定 val 變量只能在 File2.c 使用了,其他模組(不管是
在 .h 或 .c 檔中)就算 extern int val; 也不會不小心誤用。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.214.120
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章