File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -8,12 +8,13 @@ namespace std {
88 using jmp_buf = unspecified;
99}
1010```
11+ * unspecified[italic]
1112
1213## 概要
1314
1415`jmp_buf`は、非ローカルジャンプ(関数を跨いだジャンプ)を実現するために、現在の実行環境を保存するための配列型である。
1516
16- `setjmp()`マクロによって現在の環境がこの型に保存され、後に`longjmp()`関数がその環境を復元するために使用される。
17+ [ `setjmp()`](setjmp.md) マクロによって現在の環境がこの型に保存され、後に[ `longjmp()`](longjmp.md) 関数がその環境を復元するために使用される。
1718
1819## 例
1920
@@ -23,14 +24,14 @@ namespace std {
2324
2425std::jmp_buf env;
2526
26- void low_level_function () {
27+ void inner_function_function () {
2728 std::cout << "何らかのエラー" << std::endl;
2829 std::longjmp(env, 42);
2930}
3031
3132int main () {
3233 if (setjmp(env) == 0) {
33- low_level_function ();
34+ inner_function_function ();
3435 } else {
3536 std::cout << "エラーから復帰しました" << std::endl;
3637 }
Original file line number Diff line number Diff line change @@ -11,24 +11,30 @@ namespace std {
1111
1212## 概要
1313
14- 引数`env`に保存された実行環境を復元し、対応する`setjmp()`の呼び出し地点へプログラムの制御を移す(非ローカルジャンプ)。
14+ 引数`env`に保存された実行環境を復元し、対応する[ `setjmp()`](setjmp.md) の呼び出し地点へプログラムの制御を移す(非ローカルジャンプ)。
1515
1616## 効果
1717
1818* `setjmp()`によって第一引数`env`に保存された実行環境(スタックポインタ、プログラムカウンタ等)を復元する。
1919
20- * プログラムの実行地点を、対応する`setjmp()`の呼び出し地点へジャンプさせる。
20+ * プログラムの実行地点を、対応する[ `setjmp()`](setjmp.md) の呼び出し地点へジャンプさせる。
2121
22- * ジャンプ先の`setjmp()`は、この関数の第二引数`val`を戻り値として返す。ただし、`val`が0の場合は1を返す。
22+ * ジャンプ先の[ `setjmp()`](setjmp.md) は、この関数の第二引数`val`を戻り値として返す。ただし、`val`が0の場合は1を返す。
2323
2424## 戻り値
2525
2626この関数は決して返らない。
2727
2828## 備考
2929
30- * ジャンプによって自動記憶域期間を持つオブジェクトのスコープを抜ける際、そのオブジェクトが非トリビアルなデストラクタを持つ場合、動作は未定義である。
31- * コルーチンのサスペンションコンテキスト内で呼び出された場合、動作は未定義である。
30+ 以下の場合、動作は未定義である。
31+ * 対応する`setjmp` と `longjmp` の間で、自動記憶域期間を持つ非トリビアルなデストラクタを持つオブジェクトの生存期間が開始し、終了しない場合(ジャンプによってデストラクタを飛ばす場合)
32+ * コルーチンのサスペンションコンテキスト内で呼び出された場合
33+ * 対応する`setjmp`が存在しない場合(`env`が有効な環境を保存していない場合)
34+ * `longjmp`は、対応する`setjmp`の呼び出しから同一スレッド内で呼び出されなければならない。異なるスレッドから呼び出された場合
35+ * `setjmp`を実行した関数が終了している場合
36+
37+ また、`volatile`修飾子のついていない`setjmp`を呼び出した関数に対してローカルな変数で、その値が`setjmp`から`longjmp`の呼び出しの間で変更されたものがある場合、その変数の値は不定となる。
3238
3339## 例
3440
Original file line number Diff line number Diff line change 33* macro[ meta id-type]
44
55``` cpp
6- #define setjmp (env )
6+ #define setjmp (env ) unspecified
77```
8+ * unspecified[italic]
89
910## 概要
1011
1112現在の環境を引数`env`に保存するマクロ。
12- ` env ` は、` jmp_buf ` 型のオブジェクトでなければならない。
13+ `env`は、[ `jmp_buf`](jmp_buf.md) 型のオブジェクトでなければならない。
1314
1415## 事前条件
1516
1617このマクロは以下の文脈でのみ現れる。
1718
18- 1 . ` if ` 文、` switch ` 文やループの条件式全体
19+ 1. 1. `if`文、`switch`文やループの条件全体
19202. 関係演算子または等価演算子のオペランドの一つ(もう一つのオペランドは整数定数)で、その結果式が1を満たす場合
20- 3 . ` ! ` のオペランドであり、その結果式が1を満たす場合
21- 4 . expression statementの式全体 (` void ` 型へのキャストを含む)
21+ 3. `!`のオペランドであり、その式が1を満たす場合
22+ 4. 式文の式全体 (`void`型へのキャストを含む)
2223
2324上記以外の箇所での呼び出しは未定義の動作となる。
2425
2526## 戻り値
2627
2728直接マクロが呼び出された場合、0を返す。
28- それ以外(` longjmp ` 関数から)の呼び出しでは非0を返す。
29- なお、` longjmp ` 関数の第二引数が0の場合は、1を返す。
29+ それ以外([ `longjmp`](longjmp.md) 関数から)の呼び出しでは非0を返す。
30+ なお、[ `longjmp`](longjmp.md) 関数の第二引数が0の場合は、1を返す。
3031
3132## 備考
3233
33- * 対応する` setjmp ` と ` longjmp ` の間で、自動記憶域期間を持つ非トリビアルなデストラクタを持つオブジェクトの生存期間が終了する場合 (ジャンプによってデストラクタを飛ばす場合)、その動作は未定義である。
34+ * 対応する`setjmp` と `longjmp` の間で、自動記憶域期間を持つ非トリビアルなデストラクタを持つオブジェクトの生存期間が開始し、終了しない場合 (ジャンプによってデストラクタを飛ばす場合)、その動作は未定義である。
3435* コルーチンのサスペンションコンテキスト内で呼び出された場合、動作は未定義である。
3536
3637
@@ -51,7 +52,7 @@ int main () {
5152 if (setjmp(env) == 0) {
5253 low_level_function();
5354 } else {
54- std::cout << "エラーから復帰しました"std::endl;
55+ std::cout << "エラーから復帰しました" << std::endl;
5556 }
5657
5758 return 0;
You can’t perform that action at this time.
0 commit comments