関数外へ分岐できます。これは同一関数内の分岐に制限されるgotoを拡張したものです。
#include <setjmp.h>
jmp_buf buf;
void Func()
{
longjmp(buf, 2); // setjmp()の戻り値を2として、その位置へ戻る
}
void Main()
{
int val = setjmp(buf);
switch (val)
{
case 0:
// 初回の呼び出し時は、ここに来る
break;
case 1:
return;
case 2:
// longjmp()の呼び出し後は、ここに来る
return;
}
Func();
}