2011-04-25 116 views
1

C語言中有try-catch語句嗎?還是有人制作的外部圖書館?將是非常有用的C語言中的try-catch語句C

如果不是,有沒有辦法可以確定一個變量是否是一個數組?

+6

我不寒而慄想象你寫的程序,不知道如何判斷一個變量是否是一個數組,而不是每個訪問在try/catch中都包含... – drysdam 2011-04-25 02:17:14

+0

不是每個訪問 - 只是檢查數組大小是痛苦的一點。這就是它的形式。 – tekknolagi 2011-04-25 02:25:02

回答

3

C語言中有try-catch語句嗎?還是有人制作的外部圖書館?將是非常有用的

在Windows上有SEH,但你真的不應該使用它的一般應用程序的用法。沒有像C++析構函數那樣的東西,就不可能寫出真正的異常安全代碼。

如果不是,有沒有辦法可以確定一個變量是否是一個數組?

是的。你自己跟蹤它。

+0

沒有sizeof ...? – tekknolagi 2011-04-25 02:24:18

+0

@tekknolagi:不僅僅是一個指向數組的塊的指針,你必須自己傳遞數組長度。 (我假設你正在談論傳遞給函數?) – 2011-04-25 02:45:51

+0

我的意思是使用sizeof()作爲一種方式來確定是否作爲一個數組,假設由sizeof()返回的值將大於,說,sizeof(4)。 – tekknolagi 2011-04-25 03:06:56

1

C中沒有try-catch語句,但是您可以使用jump buffers來構建exception mechanism。但是,這可能是一個非常糟糕的想法,因爲現在有辦法在拋出異常時自動釋放資源。

如果您指的是void *作爲變量,則無法確定它是否爲數組。但是,您也可以在應用程序中創建邏輯來實現runtime type information (RTTI)

+1

你可以構建一個*資源泄漏*異常機制....沒有析構函數,幾乎不可能在那裏寫出安全的代碼.... – 2011-04-25 01:54:19

+0

當然,但你可以說使用malloc同樣的事情。 – 2011-04-25 02:10:33

+1

我不明白你的觀點。如果沒有A.析構函數或B.' finally'子句,就無法正確管理資源。你不能拿到C中的任何一個。 – 2011-04-25 02:11:52

0

當然,C語言對異常沒有本地支持。

看看下面的鏈接,基本上,它使用的setjmp()和longjmp():

http://www.on-time.com/ddj0011.htm

+4

該死的,你剛剛發佈的鏈接有'void main's! – 2011-04-25 01:55:50

0

如果編譯器可以判斷一個變量是一個數組,這樣你就可以。只要查看聲明的位置(或者在動態分配數組的情況下爲malloc'd)。

+1

sizeof(指針)始終是相同的......:/ – 2011-04-25 02:09:12

+0

@比利 - 不一定。 IIRC,該標準僅要求'void *'足夠大以容納任何(對象)指針類型,而不是指針類型必須具有相同的大小。 – 2011-04-25 02:38:25

+0

@Chris:據我所知,沒有。 C(和C++)不要求函數指針類型與數據指針類型的大小相同,但大多數情況下指針是指針。 C允許'int','float','struct'和'union'類型之間的區別。但是,sizeof(struct A *)'和sizeof(struct B *)'必須相同。參見該標準的第6.2.5.27節。 (並且一般要求'指向 兼容類型的合格或不合格版本應具有相同的表示和對齊要求') – 2011-04-25 02:53:29

0

try-catch是一個針對C++等面向對象環境的錯誤處理方案。 ANSI C不是面向對象的,它需要你聲明你的變量類型。在C中,錯誤處理主要通過檢查被調用函數的返回值來執行。你可以看到在這裏的凌亂螺紋:ANSI C equivalent of try/catch?

1

我開發exceptions4c,異常處理系統中C(可移植的ANSI C)是目前支持:throwtrycatchfinally和一些更多的好東西。例如,它支持配置模式,因此您可以自動釋放資源。您也可以處理信號(如SIGFPESIGSEGV),就好像它們是例外情況一樣。