2011-04-25 120 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),就好像它们是例外情况一样。