文章總列表

軟體架構,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]
}

我不打算接受這個建議

  1. service.h想維持獨立(不依賴別人)
  2. 其他吃service.h的人,未必需要user_a_intf.h(介面的污染)
  3. 如果user_a_intf.h如果也吃service.h,會產生circular inclusion,有潛在的問題


最後的解法

最後我們找到完美的解法,既可以維持介面獨立,又可以解決維護問題,兩個人都滿意

  1. 服務端service.h維持獨立,最終的長相就是那樣

  2. 在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的看法,看起來是沒問題的




留言

這個網誌中的熱門文章

STM32 UART + DMA,使用HAL實作TX/RX,以及不定長度接收

小米掃地機器人S20+ review

玩CAN bus的傢伙們 (1) CandleLight-based USB-CAN