讓我們有兩個庫:libA.a和libB.a. 它們被組織成 stlibA.a呼叫libB.a函式并提供對自身的回呼。換句話說,以下呼叫堆疊是可能的:
#0 liba_callback()
#1 libb_function()
#2 liba_function()
libA.a編譯時-fexceptions和libB.a與編譯-fno-exceptions。
問題是:如果liba_callback()拋出會發生什么?我可以處理這個liba_function()嗎?我可以通過沒有例外編譯的函式拋出例外嗎?這種行為有定義嗎?
uj5u.com熱心網友回復:
正如@Pete Becker 所指出的,例外是語言的一部分,因此編譯器負責記錄此類 C 方言。
在海灣合作委員會的檔案說:
在詳細說明庫對 -fno-exceptions 的支持之前,首先要注意使用此標志時丟失的東西:它會破壞嘗試通過使用 -fno-exceptions 編譯的代碼的例外,無論該代碼是否有任何 try 或 catch結構體。如果您可能有一些拋出的代碼,則不應使用 -fno-exceptions。如果您有一些使用 try 或 catch 的代碼,則不應使用 -fno-exceptions。
特別是,在沒有展開資訊的情況下擊中堆疊幀是有問題的:
特別是,展開到沒有例外處理資料的幀將導致運行時中止。如果展開器在找到處理程式之前用完展開資訊,則呼叫 std::terminate()。
總結:
問題是:如果 liba_callback() 拋出會發生什么?
abort() 叫做。
我可以在 liba_function() 中處理這個嗎?
不。
我可以通過沒有例外編譯的函式拋出例外嗎?
不。
這種行為有定義嗎?
不可以。它僅被記錄為編譯器擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371607.html
