2012-09-20 161 views
2

你好,請再次打擾我__try和__exception可移植性

我在閱讀「檢測IA-32體系結構中的多處理器拓撲」。我正在記錄這個例子。不過,我在代碼中讀取了這些句子__try和__except。

我發現MSDN Microsoft網頁的一些信息,但我用gcc編譯器/連接

在GCC __try __except和有效的句子? 在* nux環境中是__try和__except便攜式語句? 確實存在比__try和__except語句更好的模式用於C中的異常處理?

在此先感謝。

回答

1

C標準沒有異常處理支持。 C++的確如此。有很多使用setjmp的try/catch實現。

3

一般考慮

MSDN__try__except是擴展的C語言。因此,它們不能隨身攜帶。

對於某些應用程序,可能使用宏和setjmp/longjmp構造來模擬它們的行爲。通常情況並非如此。特別是,MSDN指出

__except表達式在__try正文的範圍內執行。

單獨使用宏無法實現。

您的問題

__try和GCC __except有效的句子?

不,他們不是,因爲GCC不支持C.

的這個微軟方言是__try __except和便攜式句子上* NUX環境?

不,他們不是,雖然有辦法在* nix上實現類似的異常處理。

確實存在比__try和__except語句更好的模式來處理C語言中的異常?

當您執行異常處理時,有充分的理由使用C++。具有析構函數的C++作用域對象比標準C資源管理在異常情況下更加健壯。因此,雖然有一些爲C提供trycatch的實現,但我建議不要這樣做,而是傾向於使用C++。 C++中的異常處理是該標準的一部分,因此受到所有符合標準的編譯器的支持,沒有可移植性問題。

+1

不確切。 C++ try/catch只能處理C++異常。在源代碼中拋出的人。雖然__try/__除了處理任何類型異常的SEH處理程序,都包含null解除引用,除以零以及更多。根據場景和所需的穩健性級別,在Windows上,可能有更好的理由選擇使用C++的SEH處理程序 – meirm

1

__try和__except是(如Microsoft聲明的)對C/C++語言的擴展。所以它不能在gcc中移植。我認爲微軟將這些內容放在純C中(不使用C++編譯器)可能有類似於異常處理的東西。 * 小號 * tructured * Ë * xception * ^h * andling(SEH)是相當低的水平,而據我所記得的,甚至微軟自己的C++異常處理引擎蓋下使用SEH。

我認爲整個事情是,如果你看到__try和__except,只需用try和catch代替它,然後用C++編譯器編譯即可。您當然必須更換傳遞給__except的過濾器,但這不是什麼大問題。