嵌入式開發:在嵌入式應用程式中混合C和C++

粵嵌教育 發佈 2024-05-09T21:56:24.611281+00:00

許多嵌入式應用程式仍使用c語言編寫,但越來越多的嵌入式開發人員現在使用C++語言編寫程序。某些應用程式甚至共享這兩種語言。這有意義嗎?  C是嵌入式應用中最常用的程式語言。多年來,人們一直期待著向C++過渡,但過渡速度相當緩慢。但是,許多開發人員正在考慮或計劃這樣做。

  許多嵌入式應用程式仍使用c語言編寫,但越來越多的嵌入式開發人員現在使用C++語言編寫程序。某些應用程式甚至共享這兩種語言。這有意義嗎?

  C是嵌入式應用中最常用的程式語言。多年來,人們一直期待著向C++過渡,但過渡速度相當緩慢。但是,許多開發人員正在考慮或計劃這樣做。C++實質上是c的超集。因此,這兩種語言完全可以混合使用。

  雖然c和C++可以混合使用,但有三個問題:

  為什麼要這麼做?

  怎麼做?

  有什麼缺點或問題嗎?

  為什麼在嵌入式應用程式中混合使用C和C++代碼?

  簡單的答案是遺留代碼。一個新項目很少從頭開始。如果是這樣,嵌入式開發人員可以用C++編寫所有內容。

  然而,更合理的出發點和更可能的是重用現有代碼,無論是從內部還是外部原始碼。這段代碼是C。因此,要繼續使用C++,這兩種語言的混合幾乎是不可避免的。

  

  如何混合C和C++代碼?

  C和C++共存有兩種基本方式:

  方法A:混合代碼的明顯方法是嵌入式開發人員用自己的編譯器編譯每個模塊,然後將所有對象模塊連接在一起。然而,這會立即導致一個問題:報告連結錯誤。這是因為C++編譯器更改了函數的名稱,這被稱為「mangling」。

  這些更改生成由原始標識符和函數參數的數量和類型的組合組成的唯一名稱。這有兩個原因:第一,當函數聲明、定義和調用不匹配時,會發生連結錯誤。[這被稱為「類型安全連結」。]其次,它有助於重載函數,其中兩個函數具有相同的名稱,但具有不同的參數組合;「mangling」使每個名稱都唯一。

  這個問題可以用外部C結構來解決。使用此限定符聲明C++函數意味著其名稱不會更改。C函數的外部聲明應用程式確保C++編譯器不會管理對該函數的調用。

  方法B:另一種方法是使用C++編譯器編譯C代碼,即將其視為C++代碼。如果C是C++的真正子集,這將無縫地工作。事實上,嵌入式開發人員需要非常小心地「清理」代碼並確保它真正兼容。

  混合C和C++代碼有什麼缺點嗎?

  混合這兩種語言的缺點很少。在方法A中,存在類型安全連結丟失的問題。然而,這隻適用於從C++調用的C函數,反之亦然。其他C++函數不受影響。當然,公共函數不能重載。

  從長遠來看,方法B的應用更好,因為一旦清理乾淨,代碼就可以被當作C++處理,並且可以使用該語言的函數。

  如前所述,清潔過程並不簡單。因此,嵌入式開發人員必須權衡工作的成本效益比率和未來使用遺留代碼的可能性。


關鍵字: