看板 C_and_CPP 關於我們 聯絡資訊
遇到兩個設計上的問題如下 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
loveme00835:1.用 namespace 分開型別定義 08/13 13:43
loveme00835:為了方便你可以自己提供兩種標頭檔, 有/無 using 08/13 13:44
loveme00835:namespace 的版本, 這也是標準庫表頭檔常用的方法 08/13 13:45
tinlans:請直接 #include "a.h",不然就叫他把 enum 定義切到單獨 08/13 13:46
tinlans:的 header 去。我比較奇怪的是你想重複定義 enum A 幹嘛。 08/13 13:46
tinlans:需要維持一致性的東西,就讓它只出現在一個地方。 08/13 13:49
adxis:大概如他所說不想 include a.h 吧 08/13 13:49
QQ29:所以全部拉出來嗎 因為我也不好意思叫他改.... 08/13 13:50
QQ29:我只需要用到這enum A其他都不干我的事 所以不知該怎辦 08/13 13:50
tinlans:那就乖乖 include a.h 啊,又不是 286 的機器怕什麼。 08/13 13:51
tinlans:現在的 CPU 執行一個指令連 1ns 用不到。 08/13 13:52
tinlans:你怕衝名稱而不去 include,linking time 一樣衝 symbol。 08/13 13:53
tinlans:重複把別人定義的東西在自己這邊重新定義一份, 08/13 13:55
tinlans:怎麼看 100% 都是你錯,到時候出事只有你被罵。 08/13 13:55
tinlans:不好意思叫他改 <--- 團隊合作就是需要練習溝通... 08/13 13:56
tinlans:學工程的,只要是對的事情,沒那麼難講話。 08/13 13:57
loveme00835:說不定自己定義是因為數值上有什麼需要改吧 ? 08/13 14:06
loveme00835:例如 enum BOOL{ TRUE, FALSE }; 這個用起來就不方便 08/13 14:09
tinlans:從他的描述來看明顯是閃避引入太多東西直接 copy 過去。 08/13 14:38
alongalone:能用 ifdef 去解決嘛 08/13 17:25
QQ29:ifdef不能解決吧?對兩個cpp來說都是 not def不是嗎? 08/13 17:54
QQ29:想一想a大意思是 a.h define一個XXX 然後我的b.h用ifdef去夾 08/13 18:01
QQ29:enum嗎? 08/13 18:01
VictorTom:推t大說的:) 08/13 19:55
VictorTom:至於dep的問題, 小弟我不太清楚您的狀況, 如果A要用B, 08/13 19:59
VictorTom:那就A裡直接dlopen B出來, 或者proj編譯時設好dep吧?? 08/13 19:59
VictorTom:系統service自己也有dep的問題, 所以順序這種事應該是 08/13 20:00
VictorTom:肯定能解決的@_@" 08/13 20:00
QQ29:V大意思是 順序可以predefine的嗎? 08/14 00:02
VictorTom:我的意思是, 你是要A.dll自己去load B.dll嗎?? 是的話, 08/14 00:13
VictorTom:不管是直接link .lib自己在process start-up時, 還是 08/14 00:13
VictorTom:A.dll runtime時自己dlopen B.dll, 應該都沒有問題啊?? 08/14 00:14
VictorTom:或者你是A.dll註冊一個service, 然後B.dll是另一個 08/14 00:14
VictorTom:service, 其中A要dep on B的service?? 是的話, 考量到 08/14 00:14
VictorTom:windows本來就有些service有dep, 用service manager也 08/14 00:15
VictorTom:可以查到相依性, 所以理論上應該存在方法建立起AB之間 08/14 00:16
VictorTom:的關係, 以達成你想要A service起來時能和已經ready 08/14 00:16
VictorTom:的B service溝通這件事, 只是方法還有待研究就是了. 08/14 00:17
VictorTom:如果不是以上兩者, 只好請你再描述清楚具體你要什麼@_@" 08/14 00:17
VictorTom:不過小弟的認知還在.dll是給process load的, 不曉得如果 08/14 00:19
VictorTom:是service那種情形到底會怎麼(還是能不能?)運作....Orz 08/14 00:20
yoco315:正確答案是1,男人這個時候也得選1 08/14 08:37
tinlans:不然你可以寫一個簡單的 parser,去掃你同事的 header 檔 08/14 09:14
tinlans:,把那個 enum 定義複製出來導向另一個 header。 08/14 09:14
tinlans:但是你最好祈禱你同事不管怎樣改 code,你的 parser 都 08/14 09:15
tinlans:不會出現 bug,不然下場還是只有你被罵。 08/14 09:15
tinlans:80 年代的大混沌時期真的有一些人幹過這種事。 08/14 09:16
tinlans:甚至還有什麼 source editor,功能類似 autoconf 會去偵測 08/14 09:16
tinlans:系統組態。但它偵測完還會自動修改 source code 而不是用 08/14 09:17
tinlans:macro。現在幹這種事大概直接被拖去廁所打了。 08/14 09:17
tinlans:不過在那個年代幹這種事,卻會有很多人拍手說你好神 XD 08/14 09:25
kevingwn:如你所願稱心如意的隨你搞啦~ 08/14 12:34
kevingwn:最簡單的方法,跟同事說以後a,b都給你maintain,那就可以 08/14 12:35
kevingwn:oops...請將前面兩句顛倒來看orz 08/14 12:36
mingtai1:個人意見:好的Design,API部分不該跟細節的實作放在一起 08/14 23:20
mingtai1:a.cpp的enum是給人用的,裡面卻又有一堆只有自己用的東西 08/14 23:21
mingtai1:可能design上面就有點問題.如果初期權責沒劃分好就會這樣 08/14 23:23