為什么API多用C而不是C++,為什么C++程序大多不使用異常


讀Defective C++隨筆


不盡知用兵之害者,則不能盡知用兵之利也 ——《孫子兵法》

1.為什么API多用C而不是C++
以前就一直很奇怪,為什么API大都用C的方式提供,即使有C++的接口也只是把C的函數又包一層。既然大家都在用C++的編譯器,為什么不直接提供C++的API?當初曾經做過一些編譯C++DLL的嘗試,印象中只是很麻煩,感覺像是編譯器支持不好。其實,最核心的原因在於類的私有成員必須出現在頭文件里。每當修改實現時,如果修改了私有成員,那么所有使用該DLL的模塊都必須重新編譯。這意味着無法獨立更新C++ API的DLL。而且API庫的使用者必須使用和該API庫相同的編譯器編譯,或者被專門設計成能兼容其DLL的編譯器(如以前Borland C++的MFC兼容模式)。所以,API大多要么用C,要么用COM式的純接口。

2.為什么C++程序大多不使用異常
由於C++加入異常功能較晚,絕大大多數的程序采用了C的返回錯誤碼的方式。這些代碼不是異常安全的代碼,因為它們不能保證在拋出異常時正確釋放內存等資源。異常拋出時會跳轉到最近的catch語句,后續的資源釋放代碼將不會執行。要保證異常安全,所有的堆分配對象指針必須使用smart_ptr或shared_ptr等智能指針對象包裝,或者用擴展的try-finally語句顯示控制釋放。而程序員大多不願引入更多的麻煩,干脆不用異常。但這也帶來一些問題,構造函數和重載運算符函數無法返回錯誤碼,所以只能要求它們保證成功。所以便有了構造函數不要做任何資源分配的訓誡。不過,即使使用異常,也不能完全解決構造函數運行出錯的問題,因為C++規定,構造函數失敗,析構函數不會執行。就是說在構造函數拋出異常前分配的資源將無法釋放。

 

http://blog.csdn.net/nightmare/article/details/2296750


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM