Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,8 @@
| [`<climits>`](/reference/climits.md) | 整数型の最小値、最大値を表すマクロ | |
| [`<clocale>`](/reference/clocale.md) | ロケール | |
| [`<cmath>`](/reference/cmath.md) | 数学関数 | |
| `<csetjmp>` | ジャンプ処理 | |
| [`<csignal>`](reference/csignal.md) | シグナル | |
| [`<csetjmp>`](/reference/csetjmp.md) | ジャンプ処理 | |
| [`<csignal>`](/reference/csignal.md) | シグナル | |
| `<cstdalign>` | アライメント操作のマクロ | C++17で非推奨<br/> C++20で削除 |
| `<cstdarg>` | 可変引数操作 | |
| [`<stdbit.h>`](/reference/stdbit.h.md) | ビット操作 | C++26 |
Expand Down
21 changes: 21 additions & 0 deletions reference/csetjmp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# csetjmp
* csetjmp[meta header]

`<csetjmp>`ヘッダでは、非ローカルジャンプのための機能を定義する。非ローカルジャンプは、関数呼び出しのスタックを遡って、特定のポイントにジャンプすることを可能にする機能である。

## 型
| 名前 | 説明 | 対応バージョン |
|------|------| ----------------|
| [`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()`で保存された環境を復元し、ジャンプするための関数 | |
54 changes: 54 additions & 0 deletions reference/csetjmp/jmp_buf.md
Original file line number Diff line number Diff line change
@@ -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 <iostream>
#include <csetjmp>

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)
69 changes: 69 additions & 0 deletions reference/csetjmp/longjmp.md
Original file line number Diff line number Diff line change
@@ -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 <iostream>
#include <csetjmp>

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)
75 changes: 75 additions & 0 deletions reference/csetjmp/setjmp.md
Original file line number Diff line number Diff line change
@@ -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 <iostream>
#include <csetjmp>

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)
11 changes: 11 additions & 0 deletions reference/csetjmp/stdc_version_setjmp_h.md
Original file line number Diff line number Diff line change
@@ -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
```
## 概要
`<csetjmp>`ヘッダがC23の基準に準拠していることを示すマクロ。
Loading