2011-10-05 128 views
3

是否有一些跨平臺的c庫用於異常處理(在C中實現try/catch)?純C異常處理庫

我也在尋找文檔它是如何在C實現++(如何中斷被屏蔽或者是這樣的)

+2

@Tim是的,C++ trows異常和C沒有,因此他尋找一個庫在C中實現相同。我沒有看到這裏很難理解。 –

+3

有這篇文章:http://www.on-time.com/ddj0011.htm和這個http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html – xanatos

+0

@ChristianRau我重讀它又多了幾次,最後看到了你所看到的。做了一些編輯,對於噪音感到抱歉(但最初很難理解) –

回答

3

一種方式來實現類似的結果,以C++異常處理是使用setjmp和longjmp的。查看維基百科頁面獲得一個簡單的例子:http://en.wikipedia.org/wiki/Setjmp.h。查看Lua解釋器的源代碼以瞭解真實世界的例子。

請注意,這不會是try/catch的真正實現,因爲您可以從C++調用庫並獲得實際的異常。

0

XXL就是這樣一個庫。

0

OSSP ex庫似乎滿足您的要求。它利用上下文切換功能,並且是線程安全的。編寫和記錄得很好,就像所有的OSSP組件一樣。

7

您可以試試exceptions4c;它是ANSI C中的一個異常處理庫,支持:throwtry,catch,finally以及其他一些好東西。例如,它支持配置模式,因此您可以自動釋放資源。您也可以處理信號(如SIGFPESIGSEGV),就好像它們是例外情況一樣。

它在setjmplongjmp(標準C庫)之上實現,它是免費軟件,因此您可以閱讀和修改源代碼。

哦,順便說一下,我是作者:)請看看它,並將其與other alternatives進行比較,以查看哪個最適合您。

0

試試這個。

#define TRY   char *__exc_message = NULL; do 
#define THROW(exc) { __exc_message = exc; break; } 
#define CATCH(exc) while(0); if(__exc_message != NULL) { exc = __exc_message; 
#define FINALLY  } 

void Test(int a, int b) 
{ 
    char *exc = NULL; 

    TRY 
    { 
     if(a < b) THROW("A < B!"); 
     if(a > b) THROW("A > B!"); 

     TRACE_INFO("Ok :-)"); 
    } 
    CATCH(exc) 
    { 
     TRACE_ERROR(exc); 
    } 
    FINALLY 
    { 
     TRACE_INFO("Finally..."); 
    } 
}