background image

}

int main(void)

{

f();

longjmp(j, 1);

return 0;

}

所以,你必须把 setjmp()处理成只是到其所在位置的一个非局部跳转。

Longjmp()和 setjmp()联合体运行于异常生命期的 2 和 3 阶段。longjmp(j,r)产生异常对象 r

(一个整数),并且作为返回值传送到 setjmp(j)处。实际上,setjmp()函数通报了异常 r。

下面这个例子采用 switch,能更好的展现这对函数的功能:

#include

#include

jmp_buf j;

void raise_exception(void)

{

printf("exception raised\n");

longjmp(j, 3);

printf("this line should never appear\n");

}

int main(void)

{

switch (setjmp(j))

{

case 0:

printf("''setjmp'' is initializing ''j''\n");

raise_exception();

printf("this line should never appear\n");

case 1: