嵌入式開發(fā):如何將嵌入式代碼庫從C轉(zhuǎn)換為C++?
幾十年來,嵌入式軟件工程師們一直在爭(zhēng)論是否應(yīng)該使用C++替代C語言進(jìn)行開發(fā)工作。56%的嵌入式軟件是用C語言編寫的。然而,C++已經(jīng)逐漸普及,大約23%的新嵌入式軟件項(xiàng)目都是用C++編寫的。那么,嵌入式開發(fā)人員要如何將嵌入式代碼庫從C轉(zhuǎn)換為C++?
這種過渡最好分四個(gè)階段進(jìn)行:
1.編譯器應(yīng)該將源代碼解釋為C++而不是C。
對(duì)于某些編譯器,將源文件從“.c”重命名為“.cpp”就足夠了;其他命令行需要特定的參數(shù)。由于C幾乎是C++的子集,所以這一步驟通常不需要對(duì)源代碼進(jìn)行任何更改。但也有例外。重要的是,首先對(duì)整個(gè)代碼庫執(zhí)行該步驟,否則可能無法對(duì)某些模塊執(zhí)行以下步驟,例如,如果其他模塊使用這些模塊,此步驟還可能導(dǎo)致“損壞”,即對(duì)生成的鏈接器符號(hào)的名稱進(jìn)行破壞。對(duì)于鏈接“.c”和“.cpp”模塊,需要外部“c”。可以通過同時(shí)對(duì)所有模塊執(zhí)行此步驟來避免這種情況。
2.修改代碼以使用簡(jiǎn)單的C++語言特性。
為了從更好的語法和更高的類型安全性中獲益,現(xiàn)在嵌入式開發(fā)人員可以通過以下方式改進(jìn)以前的C代碼:
l 使用名稱空間而不是前綴變量/函數(shù)名稱;
l 使用作用域枚舉而不是常規(guī)C枚舉;
l 使用C++bool代替專門定義的C bool;
l 使用static_assert而不是運(yùn)行時(shí)斷言(如果可能);
l 使用constexpr而不是常量宏,并且(如果可能)使用const
l 使用模板函數(shù)而不是“函數(shù)”宏。
3.將可識(shí)別的模擬“C-OOP代碼”轉(zhuǎn)換為真實(shí)的OOP代碼。
例如,有一個(gè)名為INSTANCE_T的結(jié)構(gòu),指向該結(jié)構(gòu)的指針被傳遞給編輯它的各種函數(shù)。將結(jié)構(gòu)轉(zhuǎn)換為適當(dāng)?shù)念?,并將函?shù)轉(zhuǎn)換為類組件。不要忘記正確指定public/private。如果有init函數(shù),嵌入式開發(fā)人員請(qǐng)記住將其轉(zhuǎn)換為類的構(gòu)造函數(shù)。
在前三個(gè)步驟中,源代碼變得更加可讀、可維護(hù)和類型安全。根據(jù)我們的經(jīng)驗(yàn),在大多數(shù)情況下,可執(zhí)行代碼的大小不會(huì)改變。我們甚至可以在ROM中的大多數(shù)模塊上執(zhí)行步驟1和2,因?yàn)樵诳蓤?zhí)行代碼中,沒有一個(gè)字節(jié)通過重新編譯而改變。

4.引入更復(fù)雜的OOP方法和其他C++語言特性。
你應(yīng)該小心地邁出最后一步。例如,開發(fā)團(tuán)隊(duì)?wèi)?yīng)該收到關(guān)于應(yīng)該使用哪些C++語言特性以及如何使用的指南。例如,類成員函數(shù)不應(yīng)被不必要地定義為虛擬,也不應(yīng)使用STL。
新模塊現(xiàn)在將從一開始就按照這些指南進(jìn)行編程。然而,將這一步驟應(yīng)用于整個(gè)現(xiàn)有代碼庫需要大量的工作。一個(gè)好的策略是嵌入式開發(fā)人員有選擇地為每個(gè)模塊執(zhí)行最后一步,例如,如果模塊無論如何都要進(jìn)行重構(gòu)。隨著時(shí)間的推移,代碼庫從C變?yōu)楦鼜?fù)雜的C++代碼。我們的代碼庫已經(jīng)過渡了大約三年。在此期間,已有數(shù)十種產(chǎn)品從這個(gè)代碼庫中脫穎而出。一些較舊且非常穩(wěn)定的模塊(例如設(shè)備驅(qū)動(dòng)程序)仍在C語言中,并將保持更長(zhǎng)時(shí)間。我們從未覺得這種混合是同一代碼庫中的問題。
結(jié)論:使用C語言,代碼更安全、更可維護(hù)++
有一個(gè)強(qiáng)大的C++子集適合于實(shí)現(xiàn)深度嵌入式系統(tǒng)。這允許程序員編寫更安全、更可維護(hù)的代碼,并實(shí)現(xiàn)在C語言中不可能實(shí)現(xiàn)的優(yōu)化。通過在上述子集內(nèi)移動(dòng),可以避免可執(zhí)行代碼中不必要的開銷。嵌入式開發(fā)人員使用四階段方法,可以將現(xiàn)有的生產(chǎn)代碼庫從C靈活地轉(zhuǎn)換為C++。