diff --git a/reference.md b/reference.md index 0263706afc..5be5e40153 100644 --- a/reference.md +++ b/reference.md @@ -229,8 +229,8 @@ | [``](/reference/climits.md) | 整数型の最小値、最大値を表すマクロ | | | [``](/reference/clocale.md) | ロケール | | | [``](/reference/cmath.md) | 数学関数 | | -| `` | ジャンプ処理 | | -| [``](reference/csignal.md) | シグナル | | +| [``](/reference/csetjmp.md) | ジャンプ処理 | | +| [``](/reference/csignal.md) | シグナル | | | `` | アライメント操作のマクロ | C++17で非推奨
C++20で削除 | | `` | 可変引数操作 | | | [``](/reference/stdbit.h.md) | ビット操作 | C++26 | diff --git a/reference/csetjmp.md b/reference/csetjmp.md new file mode 100644 index 0000000000..ff96ce769a --- /dev/null +++ b/reference/csetjmp.md @@ -0,0 +1,21 @@ +# csetjmp +* csetjmp[meta header] + +``ヘッダでは、非ローカルジャンプのための機能を定義する。非ローカルジャンプは、関数呼び出しのスタックを遡って、特定のポイントにジャンプすることを可能にする機能である。 + +## 型 +| 名前 | 説明 | 対応バージョン | +|------|------| ----------------| +| [`jmp_buf`](csetjmp/jmp_buf.md) | 非ローカルジャンプのための環境を保存するための型 | | + +## マクロ +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`setjmp`](csetjmp/setjmp.md) | 現在の環境を保存するためのマクロ | | +| [`__STDC_VERSION_SETJMP_H__`](csetjmp/stdc_version_setjmp_h.md) | C23に準拠していることを示すマクロ | C++26 | + + +## 関数 +| 名前 | 説明 | 対応バージョン | +|------|------|----------------| +| [`longjmp`](csetjmp/longjmp.md) | `setjmp()`で保存された環境を復元し、ジャンプするための関数 | | diff --git a/reference/csetjmp/jmp_buf.md b/reference/csetjmp/jmp_buf.md new file mode 100644 index 0000000000..9e20f0b750 --- /dev/null +++ b/reference/csetjmp/jmp_buf.md @@ -0,0 +1,54 @@ +# jmp_buf +* std[meta namespace] +* csetjmp[meta header] +* type-alias[meta id-type] + +```cpp +namespace std { + using jmp_buf = unspecified; +} +``` + +## 概要 + +`jmp_buf`は、非ローカルジャンプ(関数を跨いだジャンプ)を実現するために、現在の実行環境を保存するための配列型である。 + +`setjmp()`マクロによって現在の環境がこの型に保存され、後に`longjmp()`関数がその環境を復元するために使用される。 + +## 例 + +```cpp example +#include +#include + +std::jmp_buf env; + +void low_level_function() { + std::cout << "何らかのエラー" << std::endl; + std::longjmp(env, 42); +} + +int main () { + int result = setjmp(env); + if (result == 0) { + low_level_function(); + } else { + std::cout << "エラーから復帰しました:" << result << std::endl; + } + + return 0; +} +``` +* std::jmp_buf[color ff0000] +* std::longjmp[link longjmp.md] +* setjmp[link setjmp.md] + +### 出力 +``` +何らかのエラー +エラーから復帰しました:42 +``` + +## 関連項目 +- [`longjmp()`](longjmp.md) +- [`setjmp()`](setjmp.md) diff --git a/reference/csetjmp/longjmp.md b/reference/csetjmp/longjmp.md new file mode 100644 index 0000000000..2b127cf924 --- /dev/null +++ b/reference/csetjmp/longjmp.md @@ -0,0 +1,69 @@ +# longjmp +* csetjmp[meta header] +* std[meta namespace] +* function[meta id-type] + +```cpp +namespace std { + [[noreturn]] void longjmp(jmp_buf env, int val); +} +``` + +## 概要 + +引数`env`に保存された実行環境を復元し、対応する`setjmp()`の呼び出し地点へプログラムの制御を移す(非ローカルジャンプ)。 + +## 効果 + +* `setjmp()`によって第一引数`env`に保存された実行環境(スタックポインタ、プログラムカウンタ等)を復元する。 + +* プログラムの実行地点を、対応する`setjmp()`の呼び出し地点へジャンプさせる。 + +* ジャンプ先の`setjmp()`は、この関数の第二引数`val`を戻り値として返す。ただし、`val`が0の場合は1を返す。 + +## 戻り値 + +この関数は決して返らない。 + +## 備考 + +* ジャンプによって自動記憶域期間を持つオブジェクトのスコープを抜ける際、そのオブジェクトが非自明なデストラクタを持つ場合、動作は未定義である。 +* コルーチンのサスペンションコンテキスト内で呼び出された場合、動作は未定義である。 + +## 例 + +```cpp example +#include +#include + +std::jmp_buf env; + +void low_level_function() { + std::cout << "何らかのエラー" << std::endl; + std::longjmp(env, 0); // valが0なので、setjmpは1を返す +} + +int main () { + int result = setjmp(env); + if (result == 0) { + low_level_function(); + } else { + std::cout << "エラーから復帰しました:" << result << std::endl; + } + return 0; +} +``` +* std::longjmp[color ff0000] +* setjmp[link setjmp.md] +* std::jmp_buf[link jmp_buf.md] + +### 出力 + +``` +何らかのエラー +エラーから復帰しました:1 +``` + +## 関連項目 +* [`jmp_buf`](jmp_buf.md) +* [`setjmp`](setjmp.md) diff --git a/reference/csetjmp/setjmp.md b/reference/csetjmp/setjmp.md new file mode 100644 index 0000000000..6b8dcae367 --- /dev/null +++ b/reference/csetjmp/setjmp.md @@ -0,0 +1,75 @@ +# setjmp +* csetjmp[meta header] +* macro[meta id-type] + +```cpp +#define setjmp(env) +``` + +## 概要 + +現在の環境を引数`env`に保存するマクロ。 +`env`は、`jmp_buf`型のオブジェクトでなければならない。 + +## 事前条件 + +このマクロは以下の文脈でのみ現れる。 + +1. 条件式または反復式の制御式全体 +2. 関係演算子または等価演算子のオペランドの一つ(もう一つのオペランドは整数定数) +3. `!`のオペランドであり、その結果式が1を満たす場合 +4. 式文の式全体(void型へのキャストを含む) + +上記以外の箇所での呼び出しは未定義の動作となる。 + +## 戻り値 + +直接マクロが呼び出された場合、0を返す。 +それ以外(`longjmp`関数から)の呼び出しでは非0を返す。 +なお、`longjmp`関数の第二引数が0の場合は、1を返す。 + +## 備考 + +* 対応する`setjmp` と `longjmp` の間で、自動記憶域期間を持つ非自明なデストラクタを持つオブジェクトの生存期間が終了する場合(ジャンプによってデストラクタを飛ばす場合)、その動作は未定義である。 +* コルーチンのサスペンションコンテキスト内で呼び出された場合、動作は未定義である。 + + +## 例 + +```cpp example +#include +#include + +std::jmp_buf env; + +void low_level_function() { + std::cout << "何らかのエラー" << std::endl; + std::longjmp(env, 42); +} + +int main () { + int result = setjmp(env); + if (result == 0) { + low_level_function(); + } else { + std::cout << "エラーから復帰しました:" << result << std::endl; + } + + return 0; +} +``` +* setjmp[color ff0000] +* std::longjmp[link longjmp.md] +* std::jmp_buf[link jmp_buf.md] + + +### 出力 + +``` +何らかのエラー +エラーから復帰しました:42 +``` + +## 関連項目 +- [jmp_buf](/reference/csetjmp/jmp_buf.md) +- [longjmp](/reference/csetjmp/longjmp.md) diff --git a/reference/csetjmp/stdc_version_setjmp_h.md b/reference/csetjmp/stdc_version_setjmp_h.md new file mode 100644 index 0000000000..7039eeb35b --- /dev/null +++ b/reference/csetjmp/stdc_version_setjmp_h.md @@ -0,0 +1,11 @@ +# __STDC_VERSION_SETJMP_H__ +* csetjmp[meta header] +* macro[meta id-type] +* cpp26[meta cpp] + +```cpp +#define __STDC_VERSION_SETJMP_H__ 202311L +``` + +## 概要 +``ヘッダがC23の基準に準拠していることを示すマクロ。