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

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