ロング ジャンプ (setjmp.h)

int setjmp( jmp_buf env );

longjmp のジャンプ先をあらかじめ記憶します。env に現在の状態が記憶され、0 が返されます。jmp_buf は、setjmp.h で構造体の配列として定義されていますが、その内容を気にする必要はありません。

void longjmp( jmp_buf env, int rv );

setjmp で記憶した場所にジャンプします。この関数を利用すると、たとえば、関数呼び出し階層の深いレベルから、一気に数段上のレベルに戻ることができます。

env には、setjmp で内容を記憶した変数を指定します。プログラムの実行は、その env を記憶した setjmp 関数から戻ったかのように続行されます。rv には、setjmp 関数からの (疑似的な) 戻り値を指定します。通常、rv には、最初の setjmp 呼び出しと区別できるように、0 以外の値を指定します。

setjmp 関数を呼び出した関数とは異なる関数から、その記憶場所への longjmp を呼び出すことができます。ただし、setjmp を呼び出した関数が終了した後で、longjmp 関数を呼び出すことはできません。

複数の env 変数を定義できるため、任意の数のジャンプ先を setjmp で記憶できます。
jmp_buf env; // ジャンプ先記憶域
void sub1() {
  longjmp( env, 7 ); // 戻り値 7 でジャンプ
  printf( "never\n" ); // この文は実行されない
}
void sub2() {
  sub1();
}
main() {
  int r = setjmp( env ); // ここを記憶
  if ( r == 0 ) { // 登録時は戻り値 0
    printf( "registered\n" );
    sub2(); // この下でジャンプが行われる
    printf( "never\n" ); // この文は実行されない
  }
  else // ジャンプで戻ったときは戻り値 7
    printf( "returned with %d\n", r );
}
結果
registered
returned with 7