?1
#include?
<
stdio.h
>
?2
#include?
<
setjmp.h
>
?3
jmp_buf?buf;
?4
?5
static
?
void
?babana()
?6
{
?7
????printf(
"
in?babana()\n
"
);
?8
????longjmp(buf,
1
);
?9
????printf(
"
never?see?me\n
"
);
10
}
11
12
int
?main()
13
{
14
????
if
(setjmp(buf))
15
????
{
16
????????printf(
"
back?in?main\n
"
);
17
????}
18
????
else
19
????
{
20
????????printf(
"
first?time?through\n
"
);
21
????????babana();
22
????}
23
????
return
?
0
;
24
}
?setjmp()首先被調用,并且返回0.
?2

?3

?4

?5

?6



?7

?8

?9

10

11

12

13



14

15



16

17

18

19



20

21

22

23

24

goto是不能跳出當前函數的,而longjmp甚至可以跳到其他文件的函數中去(估計就是為什么要在名字里加個long的原因吧,:)).
但 longjmp只能跳回到曾經去過的地方,而setjmp正是標記到過的地方,所以從這角度來想的話,longjmp更像是"從何處來"而不是goto"去哪里".
這也可以所就是C++中" catch "," throw "?的一個起源吧.