2012-03-04 49 views
6

我正在使用託管的mbed C++ compiler將C++庫移植到我的mbed中,該託管基本上是ARMCC,其配置不能真正更改。他們決定的配置選項之一(出於某些未知原因)是不支持異常。因此,throwcatch將產生編譯器錯誤。使用不支持異常的C++編譯器嗎?

如何確切地使用標準C++庫而沒有異常?我在庫中使用了一些向量。我如何知道push_back函數是否成功?有沒有任何標準的方法知道是否發生了異常,或者只是做了exit(1)什麼的?

+0

可能重複http://stackoverflow.com/questions/3870435/handling-stl-errors-without-exceptions – Philipp 2012-03-04 08:57:29

回答

2

他們解釋爲什麼它不支持here

傳統智慧(和爲armcc編譯器的傢伙的意見) 是例外的開銷是相當高的,因此不 適合這種域。就目前而言,我們不支持異常(支持很難刪除,但易於添加 )。

我們一定會看到真正理解 開銷在某些點空間和時間(mbed是不是真的傳統,所以也許 的例外是完美的!),但現在你必須要堅持更加 傳統的異常處理方法。

而且here

我們不支持在編譯器的異常處理,並且不 計劃增加它。但我很高興聽到您通常在您的微控制器應用程序中使用 或您的體驗!但現在,您需要轉向更標準的C解決方案。

基於this我可以猜對特殊情況將在std::terminate()結束。

我不認爲不支持異常是C++中每種語言標準的合法選項。所以,你應該做一個實驗,看看newpush_back()失敗時會發生什麼,或者詢問編譯器後面的人。

3

您究竟能夠毫無例外地使用標準C++庫? I 在我的書架中使用一些載體。我怎麼知道push_back 函數實際上是否成功?有沒有任何標準的方法知道是否發生了異常,或者只是做了退出(1)或什麼?

一旦您禁用C++中的異常處理,您就冒險進入非常嚴格的領域。

一些標準庫實現,如Dinkumware's,允許禁用異常。在那裏定義宏_HAS_EXCEPTIONS爲0,STLPort與_STLP_USE_EXCEPTIONS = 0具有相似的約定。

但是,當禁用異常時,沒有標準庫應該執行的標準定義。大多數情況下,異常處理非常深入到C++語言中。即使dynamic_castoperator new/new[]默認情況下拋出,這些不是庫功能。

即使對於不拋棄的標準庫實現,也會出現什麼應該發生的明確定義。如果序列push_back引發爲該序列分配更多內存的過程,會發生什麼情況?該元素是不是被插入?這些序列的標準接口當然不會告訴我們什麼時候發生這樣的錯誤。另外,很多C++庫一般都會使用類似operator new(而不是nothrow版本)的函數。因此,一旦我們禁用異常,我們就冒險進入很多未定義的行爲領域。

我曾經不得不在一家公司工作,因爲高級程序員負責過早優化C語言,並認爲C++是糟糕和低效的(巧合的是,他們編寫了一些最低效的代碼團隊對鏈接列表的強烈偏好作爲默認容器,導致分析熱點顯示左右,這是由於爲所有內容分配/釋放的微小節點數量衆多,但這是另一回事)。

對於嵌入式系統,反對異常處理的參數可能會更強一些,但如果沒有它,通常很難依賴C++。我認爲沒有異常處理的最好辦法就是接受C++的殘缺形式,除非你想投入大量時間去尋找針對特定標準庫供應商的解決方法和技巧,否則沒有大量的標準庫部件這可能比它的價值更麻煩。