c语言中longjmp()函数,C语言的反人类函数:setjmp和longjmp的详细剖析

我希望看这篇文章的你对C++的传统异常处理,即try...catch...throw有了解(不是Windows SEH),这样才能方便你最深入的理解这2个C语言的反人类函数。

当然如果不了解就先看下面的“C++式的异常处理”,如果感觉自己了解了,可以直接skip看到“C语言中的模拟”。

【C++式的异常处理】

首先,我们写一个类,请不要想这个类有什么特别的地方,其只是为了打印出来构造和析构。class CFoo

{

public:

CFoo()

{

printf("Create CFoo.n");

}

~CFoo()

{

printf("~Destroy CFoo.n");

}

};

然后我们写一个函数,这个函数foo是为了根据情况抛出异常:void foo(int exp)

{

if (exp == 'a')

throw std::exception("a");

printf("foo ok %d.n",exp);

}

我们来写第一个main:int main()

{

int val = getchar();

foo(val);

return 0;

}

此时我们输入b,其输出的肯定是:

foo ok 98.

这里98是b的ascii值。

而我们输入a,则会出情况了:

因为foo抛出了一个异常,但是没例程去处理他,所以程序崩溃。

所以我们现在在main上加上处理foo异常的代码:int main()

{

int val = getchar();

try{

foo(val);

}catch (std::exception& ex)

{

printf("skip ex:%s.n",ex.what());

}

return 0;

}

好了,我们再次输入a,则会出现:

skip ex:a.

foo在throw下正常的printf则不会执行,流程被改变。

所以我们可以简单理解为throw是一个“带有异常信息的”return,当然实际情况比这个复杂的多,我这样说只是为了让你有一种C语言的感觉。

还记得上面那个CFoo嘛,我一直没使用它,现在我们把foo函数改一下:void foo(int exp)

{

CFoo cfoo;

if (exp == 'a')

throw std::exception("a");

printf("foo ok %d.n",exp);

}

可以看到我只加了一行代码,在堆栈上开了一个cfoo的实例,我们main不动,输入一个p试试:

Create CFoo.

foo ok 112.

~Destroy CFoo.

可以看到,其输出了CFoo的构造和析构,这个是正常的情况,因为我们看到printf执行了。

那我们输入a呢,我们来尝试&#

你可能感兴趣的:(c语言中longjmp()函数)