看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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