[問題] 引入標頭檔多次(在不同namespace)

看板C_and_CPP (C/C++)作者 ( )時間13年前 (2013/05/25 00:17), 編輯推噓3(3010)
留言13則, 6人參與, 最新討論串1/3 (看更多)
想請問如下的問題有沒有解法: B 檔案是函式庫 A 檔案是另一函式庫,會引入 B 檔案 A <===include=== B | \____________ | v > v C D 有的 client 會引入 A, 也需要用 B (並引入 B), 有的只要用 A, 不要用 B 為了讓 dependency 明顯一點, 我希望一個要用到 A & B 的 client 必須 同時 include A 跟 B, 只 include A 會 compile error (這樣做是, 例如將來我把某些 B 的功能移到另外的 Z 去時, 能明白知道哪些檔案該改) 原先的想法是在 A 中我寫成 namespace private_A { #include "B" }; 不幸的是因為 include guards, 我無法再引入 B 請問有其他解決辦法嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.46.41

05/25 00:55, , 1F
爛方法是直接 #undef B 的 include guards
05/25 00:55, 1F

05/25 01:01, , 2F
我用 #pragma once 囧
05/25 01:01, 2F

05/25 01:34, , 3F
這沒好解法,就算能放進namespace也會造成link error
05/25 01:34, 3F

05/25 01:35, , 4F
header file直接引入的做法造成許多問題,這是其一
05/25 01:35, 4F
原來還會造成 link error! 那請問這是有不直接引入, 其他選擇的意思嗎~? ※ 編輯: suhorng 來自: 118.166.46.41 (05/25 01:41)

05/25 01:48, , 5F
沒有XD 只要你還是寫C/C++就要捏著鼻子忍受它
05/25 01:48, 5F

05/25 02:43, , 6F
架構就不合理..你既然有只要A 不要B的狀況 為何A要include B
05/25 02:43, 6F

05/25 02:46, , 7F
如果你的D只要A 不要B 那你該想想 是不是B的東西A根本非必要
05/25 02:46, 7F
是 A 的某些宣告要用到 B 的東西 (有的用到的是在 private 裡面, 基本上與引入 A 的檔案無關, 也不保證未來會繼續有)

05/25 03:39, , 8F
看起來你的 B 可能一開始就是一堆可分割的東西擠在一起
05/25 03:39, 8F

05/25 03:40, , 9F
那不如一開始就把 B 的內容分割整理好
05/25 03:40, 9F
只是舉個例 也有可能是把 A 切開 (而不是把 B 切開) 規劃的確是個問題... 我還在學 所以慢慢 refactor, 一開始就要規劃好有點難... ※ 編輯: suhorng 來自: 118.166.46.41 (05/25 11:07)

05/25 15:18, , 10F
這架構很正常,B可能是底層,A則是較高階的函式庫
05/25 15:18, 10F

05/25 15:19, , 11F
原po希望把「A depends on B」隱藏起來方便日後抽換
05/25 15:19, 11F

05/25 15:20, , 12F
也是比較有彈性的想法 (突然想到可以用pimpl解決)
05/25 15:20, 12F

05/26 01:59, , 13F
有本 c++ 大型軟體開發 的書 有寫
05/26 01:59, 13F
請問是這一本嗎? http://www.books.com.tw/exep/prod/booksfile.php?item=0010531033 這好像是翻譯書, 請問品質如何呢? ※ 編輯: suhorng 來自: 118.166.50.221 (05/27 23:32)
文章代碼(AID): #1HdvAnu3 (C_and_CPP)
文章代碼(AID): #1HdvAnu3 (C_and_CPP)