[問題] 設計時遇到重複定義include的問題

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間15年前 (2010/08/13 13:34), 編輯推噓8(8049)
留言57則, 9人參與, 最新討論串1/1
遇到兩個設計上的問題如下 1. 和同事合作分別寫code 遇到一個小問題 他寫了個a.h裡面有個enum A{...};和一大堆declaration. 而我的b.cpp #include "b.h" 但我b.cpp需要知道這個enum A; 所以我在我的b.h內 手動寫個enum A{...} 不幸 我同事的a.cpp卻需要使用我提供的method (所以我才會需要用到他的enum A) 而在他的a.cpp裡面include我的b.h 加上他自己的a.h(我們兩個都有enum A) compile就出現 redefine了..... 我自己想到的解法是 1. 我的b.h, include他的a.h 但這樣讓我的b.h include一大包沒必要的資訊 好處是我不用自己拔出enum A寫在我的b.h, 他有更新我也不怕沒sync 2. 我自己知道他enum的整個宣告, 所以我改enum A改成enum AA內容也一樣} 雖然可以work但是他只要一改code我就慘了 一定要雙方sync 請教各位這種問題該如何解決? 會遇到這問題是design上的問題嗎? 還是本來就會遇到的問題 可是不知道該怎麼解.... 2. Windows系統好像有個service.exe但我不熟...似乎是負責開機load dll 但如果某兩隻dll有dependency.... 我A.dll會去load B.dll的話 我無法再開機確保說 B.dll已經launch了.... 看同事好像在解這問題....A.dll想load B.dll但B.dll還沒好 請問一下這種情況通常都是怎麼解決的呢? 有沒有最正統的解法? 我看他似乎是retry 好幾次load fail在load一次...但如果不另外開thread去load 整個開機時間就會被這A.dll給佔住???? 這方面沒什麼概念 請問各位~~ 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.147.15.66

08/13 13:43, , 1F
1.用 namespace 分開型別定義
08/13 13:43, 1F

08/13 13:44, , 2F
為了方便你可以自己提供兩種標頭檔, 有/無 using
08/13 13:44, 2F

08/13 13:45, , 3F
namespace 的版本, 這也是標準庫表頭檔常用的方法
08/13 13:45, 3F

08/13 13:46, , 4F
請直接 #include "a.h",不然就叫他把 enum 定義切到單獨
08/13 13:46, 4F

08/13 13:46, , 5F
的 header 去。我比較奇怪的是你想重複定義 enum A 幹嘛。
08/13 13:46, 5F

08/13 13:49, , 6F
需要維持一致性的東西,就讓它只出現在一個地方。
08/13 13:49, 6F

08/13 13:49, , 7F
大概如他所說不想 include a.h 吧
08/13 13:49, 7F

08/13 13:50, , 8F
所以全部拉出來嗎 因為我也不好意思叫他改....
08/13 13:50, 8F

08/13 13:50, , 9F
我只需要用到這enum A其他都不干我的事 所以不知該怎辦
08/13 13:50, 9F

08/13 13:51, , 10F
那就乖乖 include a.h 啊,又不是 286 的機器怕什麼。
08/13 13:51, 10F

08/13 13:52, , 11F
現在的 CPU 執行一個指令連 1ns 用不到。
08/13 13:52, 11F

08/13 13:53, , 12F
你怕衝名稱而不去 include,linking time 一樣衝 symbol。
08/13 13:53, 12F

08/13 13:55, , 13F
重複把別人定義的東西在自己這邊重新定義一份,
08/13 13:55, 13F

08/13 13:55, , 14F
怎麼看 100% 都是你錯,到時候出事只有你被罵。
08/13 13:55, 14F

08/13 13:56, , 15F
不好意思叫他改 <--- 團隊合作就是需要練習溝通...
08/13 13:56, 15F

08/13 13:57, , 16F
學工程的,只要是對的事情,沒那麼難講話。
08/13 13:57, 16F

08/13 14:06, , 17F
說不定自己定義是因為數值上有什麼需要改吧 ?
08/13 14:06, 17F

08/13 14:09, , 18F
例如 enum BOOL{ TRUE, FALSE }; 這個用起來就不方便
08/13 14:09, 18F

08/13 14:38, , 19F
從他的描述來看明顯是閃避引入太多東西直接 copy 過去。
08/13 14:38, 19F

08/13 17:25, , 20F
能用 ifdef 去解決嘛
08/13 17:25, 20F

08/13 17:54, , 21F
ifdef不能解決吧?對兩個cpp來說都是 not def不是嗎?
08/13 17:54, 21F

08/13 18:01, , 22F
想一想a大意思是 a.h define一個XXX 然後我的b.h用ifdef去夾
08/13 18:01, 22F

08/13 18:01, , 23F
enum嗎?
08/13 18:01, 23F

08/13 19:55, , 24F
推t大說的:)
08/13 19:55, 24F

08/13 19:59, , 25F
至於dep的問題, 小弟我不太清楚您的狀況, 如果A要用B,
08/13 19:59, 25F

08/13 19:59, , 26F
那就A裡直接dlopen B出來, 或者proj編譯時設好dep吧??
08/13 19:59, 26F

08/13 20:00, , 27F
系統service自己也有dep的問題, 所以順序這種事應該是
08/13 20:00, 27F

08/13 20:00, , 28F
肯定能解決的@_@"
08/13 20:00, 28F

08/14 00:02, , 29F
V大意思是 順序可以predefine的嗎?
08/14 00:02, 29F

08/14 00:13, , 30F
我的意思是, 你是要A.dll自己去load B.dll嗎?? 是的話,
08/14 00:13, 30F

08/14 00:13, , 31F
不管是直接link .lib自己在process start-up時, 還是
08/14 00:13, 31F

08/14 00:14, , 32F
A.dll runtime時自己dlopen B.dll, 應該都沒有問題啊??
08/14 00:14, 32F

08/14 00:14, , 33F
或者你是A.dll註冊一個service, 然後B.dll是另一個
08/14 00:14, 33F

08/14 00:14, , 34F
service, 其中A要dep on B的service?? 是的話, 考量到
08/14 00:14, 34F

08/14 00:15, , 35F
windows本來就有些service有dep, 用service manager也
08/14 00:15, 35F

08/14 00:16, , 36F
可以查到相依性, 所以理論上應該存在方法建立起AB之間
08/14 00:16, 36F

08/14 00:16, , 37F
的關係, 以達成你想要A service起來時能和已經ready
08/14 00:16, 37F

08/14 00:17, , 38F
的B service溝通這件事, 只是方法還有待研究就是了.
08/14 00:17, 38F

08/14 00:17, , 39F
如果不是以上兩者, 只好請你再描述清楚具體你要什麼@_@"
08/14 00:17, 39F

08/14 00:19, , 40F
不過小弟的認知還在.dll是給process load的, 不曉得如果
08/14 00:19, 40F

08/14 00:20, , 41F
是service那種情形到底會怎麼(還是能不能?)運作....Orz
08/14 00:20, 41F

08/14 08:37, , 42F
正確答案是1,男人這個時候也得選1
08/14 08:37, 42F

08/14 09:14, , 43F
不然你可以寫一個簡單的 parser,去掃你同事的 header 檔
08/14 09:14, 43F

08/14 09:14, , 44F
,把那個 enum 定義複製出來導向另一個 header。
08/14 09:14, 44F

08/14 09:15, , 45F
但是你最好祈禱你同事不管怎樣改 code,你的 parser 都
08/14 09:15, 45F

08/14 09:15, , 46F
不會出現 bug,不然下場還是只有你被罵。
08/14 09:15, 46F

08/14 09:16, , 47F
80 年代的大混沌時期真的有一些人幹過這種事。
08/14 09:16, 47F

08/14 09:16, , 48F
甚至還有什麼 source editor,功能類似 autoconf 會去偵測
08/14 09:16, 48F

08/14 09:17, , 49F
系統組態。但它偵測完還會自動修改 source code 而不是用
08/14 09:17, 49F

08/14 09:17, , 50F
macro。現在幹這種事大概直接被拖去廁所打了。
08/14 09:17, 50F

08/14 09:25, , 51F
不過在那個年代幹這種事,卻會有很多人拍手說你好神 XD
08/14 09:25, 51F

08/14 12:34, , 52F
如你所願稱心如意的隨你搞啦~
08/14 12:34, 52F

08/14 12:35, , 53F
最簡單的方法,跟同事說以後a,b都給你maintain,那就可以
08/14 12:35, 53F

08/14 12:36, , 54F
oops...請將前面兩句顛倒來看orz
08/14 12:36, 54F

08/14 23:20, , 55F
個人意見:好的Design,API部分不該跟細節的實作放在一起
08/14 23:20, 55F

08/14 23:21, , 56F
a.cpp的enum是給人用的,裡面卻又有一堆只有自己用的東西
08/14 23:21, 56F

08/14 23:23, , 57F
可能design上面就有點問題.如果初期權責沒劃分好就會這樣
08/14 23:23, 57F
文章代碼(AID): #1CPDb8w4 (C_and_CPP)
文章代碼(AID): #1CPDb8w4 (C_and_CPP)