Re: [問題] global structure?

看板C_and_CPP (C/C++)作者 (cppOrz)時間19年前 (2006/01/14 01:43), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
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
文章代碼(AID): #13n-R8Qq (C_and_CPP)
文章代碼(AID): #13n-R8Qq (C_and_CPP)