嵌入式開發(fā):在嵌入式應(yīng)用程序中混合C和C++
許多嵌入式應(yīng)用程序仍使用c語言編寫,但越來越多的嵌入式開發(fā)人員現(xiàn)在使用C++語言編寫程序。某些應(yīng)用程序甚至共享這兩種語言。這有意義嗎?
C是嵌入式應(yīng)用中最常用的編程語言。多年來,人們一直期待著向C++過渡,但過渡速度相當(dāng)緩慢。但是,許多開發(fā)人員正在考慮或計劃這樣做。C++實質(zhì)上是c的超集。因此,這兩種語言完全可以混合使用。
雖然c和C++可以混合使用,但有三個問題:
為什么要這么做?
怎么做?
有什么缺點或問題嗎?
為什么在嵌入式應(yīng)用程序中混合使用C和C++代碼?
簡單的答案是遺留代碼。一個新項目很少從頭開始。如果是這樣,嵌入式開發(fā)人員可以用C++編寫所有內(nèi)容。
然而,更合理的出發(fā)點和更可能的是重用現(xiàn)有代碼,無論是從內(nèi)部還是外部源代碼。這段代碼是C。因此,要繼續(xù)使用C++,這兩種語言的混合幾乎是不可避免的。

如何混合C和C++代碼?
C和C++共存有兩種基本方式:
方法A:混合代碼的明顯方法是嵌入式開發(fā)人員用自己的編譯器編譯每個模塊,然后將所有對象模塊連接在一起。然而,這會立即導(dǎo)致一個問題:報告鏈接錯誤。這是因為C++編譯器更改了函數(shù)的名稱,這被稱為“mangling”。
這些更改生成由原始標(biāo)識符和函數(shù)參數(shù)的數(shù)量和類型的組合組成的唯一名稱。這有兩個原因:第一,當(dāng)函數(shù)聲明、定義和調(diào)用不匹配時,會發(fā)生鏈接錯誤。[這被稱為“類型安全鏈接”。]其次,它有助于重載函數(shù),其中兩個函數(shù)具有相同的名稱,但具有不同的參數(shù)組合;“mangling”使每個名稱都唯一。
這個問題可以用外部C結(jié)構(gòu)來解決。使用此限定符聲明C++函數(shù)意味著其名稱不會更改。C函數(shù)的外部聲明應(yīng)用程序確保C++編譯器不會管理對該函數(shù)的調(diào)用。
方法B:另一種方法是使用C++編譯器編譯C代碼,即將其視為C++代碼。如果C是C++的真正子集,這將無縫地工作。事實上,嵌入式開發(fā)人員需要非常小心地“清理”代碼并確保它真正兼容。
混合C和C++代碼有什么缺點嗎?
混合這兩種語言的缺點很少。在方法A中,存在類型安全鏈接丟失的問題。然而,這只適用于從C++調(diào)用的C函數(shù),反之亦然。其他C++函數(shù)不受影響。當(dāng)然,公共函數(shù)不能重載。
從長遠來看,方法B的應(yīng)用更好,因為一旦清理干凈,代碼就可以被當(dāng)作C++處理,并且可以使用該語言的函數(shù)。
如前所述,清潔過程并不簡單。因此,嵌入式開發(fā)人員必須權(quán)衡工作的成本效益比率和未來使用遺留代碼的可能性。