作者LPH66 (-858993460)
看板C_and_CPP
標題Re: [問題] global variable的問題
時間Wed Jun 9 11:55:02 2010
※ 引述《Trumen (真好多人)》之銘言:
: 所以問題是在*.cpp include "main.h"時 main.h有global變數
: 使得所有*.cpp都會宣告該變數
: 所以在main.h內使用extern宣告變數的話,變數就不會重複定義了
: 而 static 本來就是 local 的,只因為它放在整個 *.cpp 的 global 區,但它
: 也只限此 *.cpp 使用,對於別的 *.cpp 有同樣的宣告並不會有任何影響。
: 以下是我的問題:
: 1. 如果用static宣告在main.h裡的變數的話
: 是否會變成所有*.cpp都會產生static變數呢? 這樣是不是有點占空間阿?
: (我只想要在main.cpp有此變數,用static寫法妥當嗎?)
: (因為我用extern會發生一些奇怪的問題...只能用static)
是的
至於你的需求...你可以考慮一下你這個變數要在哪裡可以看得到
如果只有 main.cpp 需要的話 那你就寫個 static int global; 丟在 main.cpp 就好
除非你要在別的 .cpp 裡也要看到這個變數才需要宣告 extern
不過下 extern 就相當於和 compiler 講說
「這個變數現在在哪我不知道 但 linker 會知道 所以請留個位置給 linker 填」
所以你必須要在其中一個 .cpp 實際宣告
這樣 linker 看到了這個變數實際上在哪個地方 才會做正確的連結動作
(在這層意義上來說, function declaration 其實預設都是 extern
也因此我們才能夠以宣告的方式 (不管是直接寫或 #include)
使用寫在別的地方 (包含同一個檔案的後方) 的 function)
: 2. (跟global variabla無關的問題)
: 如果main.h 有#include "function.h"
: 則如果我把 function.h改成function.cpp
: 在main.h 變成#include "function.cpp" 前後會有什麼差嗎?
這你就要了解到底 #include 做了什麼事
#include 做的事其實很單純
就是讓 compiler 幫你 copy-paste 那個檔的內容到你寫 #include 的地方
那麼你就要看那個檔案的內容如果 copy-paste 到這裡來會發生什麼事
還有就是 習慣上我們通常不會去引入 .cpp 檔
因為每個 .cpp 都是獨立的 compilation unit
整個 compile & link 的架構是這個樣子
compile link
.cpp ==========> .obj ───┐
│
.cpp ==========> .obj ───┼→ .exe
│
.cpp ==========> .obj ───┘
如果你引入了一個 .cpp 的話 你的架構就會變成
compile link
.cpp ==========> .obj ───┐
│
.cpp ==========> .obj ───┴→ .exe
↑include
.cpp
原本是互相對等的各個 .cpp 出現了包含的情形
雖然程式一樣可以 compile 可以跑
但架構上有一個 .cpp 和別人不一樣就是怪怪的
而且萬一一不小心把那個 .cpp 也當做一個 compilation unit 的話
compile link
.cpp ==========> .obj
.cpp ==========> .obj
↑include >→相同名字的東西在不同的 compilation unit 出現
.cpp ==========> .obj 容易有 link error
因為 linker 不知道這名字到底是指哪一個
(linker 並不會知道它們其實是一樣的東西)
因此習慣上我們並不會引入一個 .cpp 檔
而 .h (header file) 其實只是把共同的宣告給提出來寫在別的檔案而已
這也就是為什麼有些地方會教說「.h檔只要寫宣告別寫實作」
因為寫上實作就有可能會發生上面的情形 道理是一樣的
(template那種麻煩鬼先丟一邊去)
那如果有些時候一些東西真的沒辦法得要別寫一個檔案的話
個人習慣是會用別的副檔名 (例如 .inc) 表示這個檔案是用來被某個 source 引入的
這樣既不會和 .cpp 的定位搞混 也不會搶了 .h 慣例上的意義(ie.宣告用)這樣
--
有人喜歡邊
玩遊戲邊
上逼;
也有人喜歡邊
聽歌邊
打字。
但是,我有個請求,
選字的時候請
專心好嗎?
-- 改編自「古 火田 任三郎」之開場白
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.28.92
推 nowar100:Bravo!! 06/09 12:04
推 VictorTom:推:) 06/09 12:15
推 Trumen:推! 我目前main.h裡宣告太多function 實作部分就在*.cpp 06/09 12:34
→ Trumen:所以較好的做法應該是將*.cpp改成*.inc才對囉? 06/09 12:34
推 aecho:推:) 好文mm啊~~ 06/09 12:57
推 flashphp:推圖文並茂 :) 06/09 13:50
推 SKYWINDSEA1:推 so good!! 06/09 20:18
推 james732:推圖文並茂 06/09 20:21
推 yoco315:讓程式治癒我們 qq 06/10 21:07