對于嵌入式開發人員來說,編寫可重用、可移植且經得起時間考驗的軟件至關重要。下面是在C中創建和使用可移植類型的7個技巧。
技巧1 – 使用stdint.h
使用內置數據類型會導致不同編譯器之間的可移植性問題。C標準沒有指定整數的存儲大小,這導致一些編譯器供應商使用2或4個字節來存儲整數,結果可能是災難性的。
使用內置數據類型的安全替代方法是使用stdint.h固定寬度整數。這些數據類型uint8_t、int8_t、uint16_t、int16_t、uint32_t和int32_t指定存儲數據所需的存儲位數。移植這些數據類型中的任何一種都會在任何編譯器中導致相同的行為,并且不會導致四個字節的存儲突然變成兩個字節。
技巧2 – 使用stdbool.h
開發人員有時可能會決定他們想要一種可以存儲簡單的真或假值的數據類型。通過包含stdbool.h,可以將標準布爾數據類型及其真或假定義引入到項目中。
提示3 – 不要自定義定義 TRUE、FALSE、bool
在上一個技巧中,推薦使用標準庫文件 stdbool.h。一些嵌入式開發人員可能沒有意識到 stdbool 的存在,或者可能決定不使用它。相反,他們自定義定義 bool、true 和 false。這樣做的問題是,當移植具有自定義版本的代碼時,可能會發生不匹配,即嘗試重新定義 true、false 和 bool 并且編譯器會抱怨。不要創建自己的版本,只需遵循技巧2。
技巧4 – 遠離自定義整數類型
使用 typedef 創建簡潔明了的類型名稱是編寫嵌入式軟件的好方法。當開發人員開始定義看起來非常接近標準整數類型的非標準整數類型時,問題就出現了。例如,取下面的自定義類型
typedef volatile uint16_t vuint16_t;
在軟件中看到 vuint16_t 會令人困惑。v是什么? 混淆 volatile 關鍵字可能很危險! 不應該強迫開發人員編寫 volatile 以便閱讀代碼的開發人員知道該變量是 volatile 嗎? 讀取 vuint16_t 很容易被誤讀為 uint16_t 或更糟糕的是,嵌入式開發人員可能會意外鍵入 uint16_t 并完全錯過 v。
堅持使用標準類型,并在任何閱讀或維護代碼的人面前直接使用 volatile 等重要關鍵字。

技巧5 – 自定義類型應該有 _t
定義自定義類型時,使用 _t 來匹配固定寬度的整數類型,它簡單明了。以以下為例;
typedef enum
{
STATE_1,
STATE_2
}State_t;
很明顯,State_t 是一個 typedef。
技巧6 – 使用枚舉自定義類型
創建類似于技巧5中所示的自定義數據類型可以大大提高嵌入式軟件的可讀性和可維護性。在#define 定義上使用枚舉有很多優點。enum 的使用易于維護,移植(甚至到 C++)和 enum 將顯示在調試器監視窗口中。對枚舉進行類型定義的能力是 C 語言中非常強大的工具,因此請明智地使用它!
技巧7 – 不要混淆底層類型
使用 typedef 的危險之一是很容易混淆底層類型。例如,如果新類型未正確命名,則結構的 typedef 可以隱藏數據是結構的事實。嵌入式開發人員應該能夠閱讀和識別數據的底層類型,而無需搜索文檔或源代碼。回顧技巧4,用 v 掩蓋 volatile 是相同的想法,生成的數據類型需要以簡潔明了的方式清楚地表明它所代表的內容