Re: [問題] Header & 多檔編譯 問題

看板C_and_CPP作者 (-858993460)時間13年前 (2012/04/01 18:06), 編輯推噓3(305)
留言8則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《cory8249 (Cory)》之銘言: : 各位好: : 我想請問一些關於自訂函式 & 多檔編譯的問題 : 麻煩大家指教了 <43> : 1. : 如果想把函式獨立成一個檔案 : 是不是都要分開成 原型的 header 跟 實作的 cpp : 然後搭配 Header Guard ? 通常是這樣沒錯 不過由於 header 其實只是懶人用宣告檔而已 所以如果你確定這個宣告怎麼寫的話其實可以直接宣告在使用方 但是這樣可能會增加維護上的麻煩 (像是增減函式或是函式參數有變等等) 因此才會有 header file 的出現 : 2. : #include <cmath> 是不是只要在 .h 檔案放一次就好 ? : 主程式 & 實作.cpp 都不用再放了 ? 正好相反 #include 的東西除非是宣告裡有用到的 不然請別放在 .h 裡面 這會增加相依性 如果只是實作上有用到的標頭檔就在那個實作裡放就好 : 3. : 如果想定義有一些常數 像是 const int radio = 5; : 這句可以直接放在 .h 嗎 ?? : 因為我還有其他的檔案 compute.cpp 會用的這個 radio 跟 myMath() : 所以把 radio 定義在一個 .h 裡面 : 然後其他 cpp 再去 #include "XXX.h" : 這樣OK嗎 ?? 只要是使用這個標頭檔的檔案可能會用到的常數那放在裡面是沒什麼問題的 const 記得寫上就好 : 4. : 承(3.) 那些 .cpp 檔案要去 宣告 extern int radio; 嗎 ?? : 感覺好像要 : 但是我用 g++ -c MyFunc.cpp : 不加直接跑也可以過 : 所以 ?? 宣告 extern 是為了要讓兩邊在存取這個變數時能夠存取到同一個變數 但既然這兩個都是常數 那只要這值一樣就好 是不是同一個變數反而沒差 因此加 const 的常數不必宣告 extern (題外話, 在我試過的兩個編譯器上這樣的兩個變數的確是處於不同的位址上的) 話說回來 如果不是 const 變數的話 extern 正確的用法反而是放在 .h 裡 這樣讓所有使用這個標頭檔的人知道會有這個外部變數 然後才在其中一個 .cpp 裡面宣告它 : --- : 以上幾個問題 : 感謝各位耐心看完 -- 実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」 亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」 実琴:「難道你沒有男人的尊嚴了嗎?!」 亨:(斷然道)「沒有。在節衣縮食生活吃緊學生面前,沒有那種東西。」 --プリンセス・プリンセス 第二話 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.28.91

04/01 18:30, , 1F
非常感謝 !!
04/01 18:30, 1F

04/01 19:44, , 2F
推 沒用到實作的header可以用forward declare減少相依
04/01 19:44, 2F

04/03 00:55, , 3F
請勿將const放在.h檔 這樣會使所有include到的.cpp檔 都有
04/03 00:55, 3F

04/03 00:56, , 4F
一份該const變數在記憶體中 建議的做法是 const 寫在某.cpp
04/03 00:56, 4F

04/03 00:57, , 5F
中 其他該變數的cpp 在extern宣告使用之
04/03 00:57, 5F

04/03 00:58, , 6F
關鍵是 const被g++視為 internal linkage 不會佔用全域空間
04/03 00:58, 6F

04/03 00:59, , 7F
這意味著 每個cpp中同名的const變數皆是不同的!
04/03 00:59, 7F

04/03 08:27, , 8F
推樓上
04/03 08:27, 8F
文章代碼(AID): #1FU2Yn_c (C_and_CPP)
文章代碼(AID): #1FU2Yn_c (C_and_CPP)