我正在研究一個用 ANSI C 撰寫的嵌入式系統。就其價值而言,它是 Pic32MX/MZ(我們在兩者上都有系統),盡管它不應該相關。我也不能使用 C 或 Rust。
我已經撰寫了代碼來控制外圍設備。我只想允許其他 1 個檔案參考此外圍設備。
所以想象我有:
perihperal1.h
peripheral1.c
my_file1.c myfile2.c
有沒有辦法確保只有 1 ofmy_file1.c或myfile2.ccan have #include perihperal1.h?
我找不到在代碼中強制它的方法,并且更愿意強制它,而不是僅僅依靠良好的紀律。
編輯:
這樣做的目的是我可以將硬體初始化代碼與可能與所述外圍設備互動的業務邏輯分開。
我想避免設定 UART,并將其包含在某處,然后將其也包含在其他地方。它可以通過適當的紀律來完成,但在大型團隊中經常會發生錯誤。
uj5u.com熱心網友回復:
如果這樣做有任何正當理由,您可以執行以下操作:
啊:
int unique_include_a = 1;
交流:
#include "a.h"
int a()
{
return 123;
}
int main()
{
a();
return 0;
}
公元前:
#include "a.h"
int b()
{
return 456;
}
編譯并鏈接:
gcc a.c b.c
聯結器應發出錯誤:
/usr/bin/ld: /tmp/ccmC6JPZ.o:(.data 0x0): multiple definition of `unique_include_a'; /tmp/ccjvwQrZ.o:(.data 0x0): first defined here
collect2: error: ld returned 1 exit status
uj5u.com熱心網友回復:
正確的解決方案是記錄 UART 代碼。沿著“注意:這是一個單例實作。它只能從專案中的單個代碼模塊呼叫。”
也可以包含針對此類嘗試的運行時防護。假設您uart_init必須先執行 which 才能使用驅動程式。然后,您可以將其實作為:
uart_result_t uart_init (/* params */)
{
static bool initialized=false;
if(initialized)
{
return UART_ERR_MULTIPLE_CALLS; // some error code
}
initialized=true;
...
}
這增加了最少的運行時開銷,并且嘗試進行多個呼叫將在開發程序中盡早被發現。
也就是說,除非您希望代碼在同一個 MCU 上處理多個相同的 UART 外設,否則您需要以不同的方式實作它。例如,作為一個不透明型別,將指定的 UART 外設標記為已采用并回傳如上例所示的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324790.html
上一篇:洗掉C中動態分配陣列的最后一個值
下一篇:用C撰寫階乘函式
