軟體架構,C語言,維持Header file彼此獨立
緣起 我提供某個服務service.h給大家用,今天要講裡面SERVICE_SZ_A參數的故事 // service.h #define SERVICE_SZ_A (10) struct { u32 user_a_data[ SERVICE_SZ_A ] } 來自USER_A的抱怨 SERVICE_SZ_A 其實是USER_A維護的,在另外一個地方也定義了 // user_a_intf.h #define USERA_SZ (10) 兩個參數放在兩個檔案,不一致會出錯,現在我們有 維護問題 了 service.h user_a_intf.h 來自USER_A的建議 簡單粗暴,希望這個參數,統一由USER_A提供,不要再自己定義了 // service.h #include "user_a_intf.h" // avoid the interface duplication struct { u32 user_a_data[ SERVICE_SZ_A ] } 我不打算接受這個建議 service.h想維持獨立(不依賴別人) 其他吃service.h的人,未必需要user_a_intf.h(介面的污染) 如果user_a_intf.h如果也吃service.h,會產生circular inclusion,有潛在的問題 最後的解法 最後我們找到完美的解法,既可以維持介面獨立,又可以解決維護問題,兩個人都滿意 服務端service.h 維持獨立 ,最終的長相就是那樣 在USER_A多放user_a_err_chk.c做檢查,工作量不多 // user_a_err_chk.c #include "service.h" #include "user_a_intf.h" #if SERVICE_SZ_A != USER_A_SZ #error #endif 在需要保持介面獨立的地方,做個副本(duplication),然後再找地方檢查,大家就開心了 這題我遇過很多次,腦袋得稍微轉彎,我預期以後還要再用。寫下來,下次可以直接用 問AI的意見 這題應該有前人解過(Internet找得到),問問AI的看法,看起來是沒問題的