Skip to content

Commit 234c4f5

Browse files
committed
csetjmpリファレンスの追加
- ヘッダページ - `jmp_buf` - `longjmp` - `setjmp`
1 parent c1cfd09 commit 234c4f5

5 files changed

Lines changed: 215 additions & 2 deletions

File tree

reference.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@
229229
| [`<climits>`](/reference/climits.md) | 整数型の最小値、最大値を表すマクロ | |
230230
| [`<clocale>`](/reference/clocale.md) | ロケール | |
231231
| [`<cmath>`](/reference/cmath.md) | 数学関数 | |
232-
| `<csetjmp>` | ジャンプ処理 | |
233-
| [`<csignal>`](reference/csignal.md) | シグナル | |
232+
| [`<csetjmp>`](/reference/csetjmp.md) | ジャンプ処理 | |
233+
| [`<csignal>`](/reference/csignal.md) | シグナル | |
234234
| `<cstdalign>` | アライメント操作のマクロ | C++17で非推奨<br/> C++20で削除 |
235235
| `<cstdarg>` | 可変引数操作 | |
236236
| [`<stdbit.h>`](/reference/stdbit.h.md) | ビット操作 | C++26 |

reference/csetjmp.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# csetjmp
2+
* csetjmp[meta header]
3+
4+
`<csetjmp>`ヘッダでは、非ローカルジャンプのための機能を定義する。非ローカルジャンプは、関数呼び出しのスタックを遡って、特定のポイントにジャンプすることを可能にする機能である。
5+
6+
##
7+
| 名前 | 説明 | 対応バージョン |
8+
|------|------| ----------------|
9+
| [`jmp_buf`](csetjmp/jmp_buf.md) | 非ローカルジャンプのための環境を保存するための型 | |
10+
11+
## マクロ
12+
| 名前 | 説明 | 対応バージョン |
13+
|------|------|----------------|
14+
| [`setjmp`](csetjmp/setjmp.md) | 現在の環境を保存するためのマクロ | |
15+
16+
## 関数
17+
| 名前 | 説明 | 対応バージョン |
18+
|------|------|----------------|
19+
| [`longjmp`](csetjmp/longjmp.md) | `setjmp()`で保存された環境を復元し、ジャンプするための関数 | |

reference/csetjmp/jmp_buf.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# jmp_buf
2+
* csetjmp[meta header]
3+
* type-alias[meta id-type]
4+
5+
```cpp
6+
using jmp_buf = unspecified;
7+
```
8+
9+
## 概要
10+
11+
非ローカルジャンプ(関数を跨いだジャンプ)を実現するために、現在の実行環境を保存するための配列型である。
12+
13+
`setjmp()`マクロによって現在の環境がこの型に保存され、後に`longjmp()`関数がその環境を復元するために使用される。
14+
15+
##
16+
17+
```cpp example
18+
#include <iostream>
19+
#include <csetjmp>
20+
21+
std::jmp_buf env;
22+
23+
void low_level_function() {
24+
std::cout << "何らかのエラー" << std::endl;
25+
std::longjmp(env, 42);
26+
}
27+
28+
int main () {
29+
int result = setjmp(env);
30+
if (result == 0) {
31+
low_level_function();
32+
} else {
33+
std::cout << "エラーから復帰しました:" << result << std::endl;
34+
}
35+
36+
return 0;
37+
}
38+
```
39+
* std::jmp_buf[color ff0000]
40+
* std::longjmp[link longjmp.md]
41+
* setjmp[link setjmp.md]
42+
43+
### 出力
44+
```
45+
何らかのエラー
46+
エラーから復帰しました:42
47+
```
48+
49+
## 関連項目
50+
- [`longjmp()`](longjmp.md)
51+
- [`setjmp()`](setjmp.md)

reference/csetjmp/longjmp.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# longjmp
2+
* csetjmp[meta header]
3+
* std[meta namespace]
4+
* function[meta id-type]
5+
6+
```cpp
7+
namespace std {
8+
[[noreturn]] void longjmp(jmp_buf env, int val);
9+
}
10+
```
11+
12+
## 概要
13+
14+
引数`env`に保存された実行環境を復元し、対応する`setjmp()`の呼び出し地点へプログラムの制御を移す(非ローカルジャンプ)。
15+
16+
## 効果
17+
18+
* `setjmp()`によってjmp_bufに保存された実行環境(スタックポインタ、プログラムカウンタ等)を復元する。
19+
20+
* プログラムの実行地点を、対応する`setjmp()`の呼び出し地点へジャンプさせる。
21+
22+
* ジャンプ先の`setjmp()`は、この関数の第二引数valを戻り値として返す。ただし、valが0の場合は1を返す。
23+
24+
## 戻り値
25+
26+
この関数は決して返らない。
27+
28+
## 備考
29+
30+
* ジャンプによって自動記憶域期間を持つオブジェクトのスコープを抜ける際、そのオブジェクトが非自明なデストラクタを持つ場合、動作は未定義である。
31+
32+
## 例
33+
34+
```cpp example
35+
#include <iostream>
36+
#include <csetjmp>
37+
38+
std::jmp_buf env;
39+
40+
void low_level_function() {
41+
std::cout << "何らかのエラー" << std::endl;
42+
std::longjmp(env, 0); // valが0なので、setjmpは1を返す
43+
}
44+
45+
int main () {
46+
int result = setjmp(env);
47+
if (result == 0) { // 直接呼び出された場合は0を返すので、エラー処理を行う
48+
low_level_function();
49+
} else {
50+
std::cout << "エラーから復帰しました:" << result << std::endl;
51+
}
52+
return 0;
53+
}
54+
```
55+
* std::longjmp[color ff0000]
56+
* setjmp[link setjmp.md]
57+
* std::jmp_buf[link jmp_buf.md]
58+
59+
### 出力
60+
61+
```
62+
何らかのエラー
63+
エラーから復帰しました:1
64+
```
65+
66+
## 関連項目
67+
* [`jmp_buf`](jmp_buf.md)
68+
* [`setjmp`](setjmp.md)

reference/csetjmp/setjmp.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# setjmp
2+
* csetjmp[meta header]
3+
* macro[meta id-type]
4+
5+
```cpp
6+
# define setjmp(env)
7+
```
8+
9+
## 概要
10+
11+
現在の環境を引数`env`に保存するマクロ。
12+
`env`は、`jmp_buf`型のオブジェクトでなければならない。
13+
14+
## 事前条件
15+
16+
このマクロは以下の文脈でのみ現れる。
17+
18+
1. 条件式または反復式の制御式全体
19+
2. 関係演算子または等価演算子のオペランドの一つ(もう一つのオペランドは整数定数)
20+
3. ! のオペランドであり、その結果式が1を満たす場合
21+
4. 式文の式全体(void型へのキャストを含む)
22+
23+
上記以外の箇所での呼び出しは未定義の動作となる。
24+
25+
## 戻り値
26+
27+
直接マクロが呼び出された場合、0を返す。
28+
それ以外(`longjmp`関数から)の呼び出しでは非0を返す。
29+
なお、`longjmp`関数の第二引数が0の場合は、1を返す。
30+
31+
## 備考
32+
33+
* 対応する`setjmp``longjmp` の間で、自動記憶域期間を持つ非自明なデストラクタを持つオブジェクトの生存期間が終了する場合(ジャンプによってデストラクタを飛ばす場合)、その動作は未定義である。
34+
* コルーチンのサスペンションコンテキスト内で呼び出された場合、動作は未定義である。
35+
36+
37+
##
38+
39+
```cpp example
40+
#include <iostream>
41+
#include <csetjmp>
42+
43+
std::jmp_buf env;
44+
45+
void low_level_function() {
46+
std::cout << "何らかのエラー" << std::endl;
47+
std::longjmp(env, 42);
48+
}
49+
50+
int main () {
51+
int result = setjmp(env);
52+
if (result == 0) {
53+
low_level_function();
54+
} else {
55+
std::cout << "エラーから復帰しました:" << result << std::endl;
56+
}
57+
58+
return 0;
59+
}
60+
```
61+
* setjmp[color ff0000]
62+
* std::longjmp[link longjmp.md]
63+
* std::jmp_buf[link jmp_buf.md]
64+
65+
66+
### 出力
67+
68+
```
69+
何らかのエラー
70+
エラーから復帰しました:42
71+
```
72+
73+
## 関連項目
74+
- [jmp_buf](/reference/csetjmp/jmp_buf.md)
75+
- [longjmp](/reference/csetjmp/longjmp.md)

0 commit comments

Comments
 (0)