最終更新日時(UTC):
が更新

履歴 編集

function
<csetjmp>

std::longjmp

namespace std {
  [[noreturn]] void longjmp(jmp_buf env, int val);
}

概要

引数envに保存された実行環境を復元し、対応するsetjmp()の呼び出し地点へプログラムの制御を移す(非ローカルジャンプ)。

効果

  • setjmp()によって第一引数envに保存された実行環境(スタックポインタ、プログラムカウンタ等)を復元する。

  • プログラムの実行地点を、対応するsetjmp()の呼び出し地点へジャンプさせる。

  • ジャンプ先のsetjmp()は、この関数の第二引数val戻り値として返す。ただし、valが0の場合は1を返す。

戻り値

この関数は決して返らない。

備考

以下の場合、動作は未定義である。

  • 対応する setjmplongjmpcatchthrow に置き換えることで、自動記憶域期間を持つオブジェクトの非トリビアルなデストラクタが呼び出される場合。例えば、setjmplongjmp の間で、非トリビアルなデストラクタを持つオブジェクトの生存期間が開始し、終了しない場合(ジャンプによってデストラクタを飛ばす場合)
  • コルーチンのサスペンションコンテキスト内で呼び出された場合
  • 対応するsetjmpが存在しない場合(envが有効な環境を保存していない場合)
  • longjmpは、対応するsetjmpの呼び出しから同一スレッド内で呼び出されなければならない。異なるスレッドから呼び出された場合
  • setjmpを呼び出した関数の実行が終了している場合

また、volatile修飾子のついていないsetjmpを呼び出した関数に対してローカルな変数で、その値がsetjmpからlongjmpの呼び出しの間で変更されたものがある場合、その変数の値は不定となる。

#include <iostream>
#include <csetjmp>

std::jmp_buf env;

void inner_function() {
  std::cout << "何らかのエラー" << std::endl;
  std::longjmp(env, 0);  // valが0なので、setjmpは1を返す
}

int main () {
  if (setjmp(env) == 0) {
    inner_function();
  } else {
    std::cout << "エラーから復帰しました" << std::endl;
  }
  return 0;
}

出力

何らかのエラー
エラーから復帰しました

関連項目