Skip to content

Commit d65e6a9

Browse files
committed
new page for embed #1422
1 parent cd443ea commit d65e6a9

File tree

3 files changed

+72
-2
lines changed

3 files changed

+72
-2
lines changed

implementation-status.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@
322322
| P2900R14: [契約プログラミングをサポートする](/lang/cpp26/contracts.md.nolink) | 関数の事前条件、事後条件、不変条件を記述できるようにする | | | | |
323323
| P2841R7: [コンセプトと変数テンプレートにテンプレートテンプレートパラメータのサポートを追加](/lang/cpp26/concept_and_variable-template_template-parameters.md.nolink) | テンプレート引数をあとで指定するテンプレートテンプレートパラメータを、コンセプトと変数テンプレートでも使用できるようにする | | | | |
324324
| P2786R13: [トリビアルな再配置](/lang/cpp26/trivial_relocatability.md.nolink) | ムーブ構築と破棄のためにビット単位のコピーとデストラクタ評価が必要になる型のオブジェクトを再配置するメカニズムを導入する | | | | |
325-
| P1967R14: [ファイルを読み込む`#embed`命令を追加](/lang/cpp26/embed.md.nolink) | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる | 15 | | | |
325+
| P1967R14: [ファイルを読み込む`#embed`命令を追加](/lang/cpp26/embed.md) | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる | 15 | | | |
326326

327327

328328
各処理系のC++26実装状況ページ:

lang/cpp26.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ C++26とは、2026年中に改訂される予定の、C++バージョンの通
8888

8989
| 言語機能 | 説明 |
9090
|----------|------|
91-
| [ファイルを読み込む`#embed`命令を追加](/lang/cpp26/embed.md.nolink) | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる |
91+
| [ファイルを読み込む`#embed`命令を追加](/lang/cpp26/embed.md) | バイナリファイルをインクルードするメカニズム。`#include`とちがって読み出しサイズなどの柔軟な指定ができる |
9292

9393

9494
### ソースコード

lang/cpp26/embed.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# ファイルを読み込む#embed命令を追加 [P1967R14]
2+
* cpp26[meta cpp]
3+
4+
<!-- start lang caution -->
5+
6+
このページはC++26に採用される見込みの言語機能の変更を解説しています。
7+
8+
のちのC++規格でさらに変更される場合があるため[関連項目](#relative-page)を参照してください。
9+
10+
<!-- last lang caution -->
11+
12+
## 概要
13+
C++26では、`#embed`ディレクティブが追加される。
14+
15+
これは、バイナリリソースを直接コード内に埋め込む機能を提供する。
16+
17+
これにより、今までは実行時に読み込んでいたファイルなどがコンパイル時点で読み込まれ、実行ファイル内に埋め込むことができるようになる。
18+
19+
## 仕様
20+
`#embed`ディレクティブによって読み込まれたバイナリは、`constexpr unsigned char`配列として扱われる。
21+
```cpp example
22+
#include <iostream>
23+
24+
int main() {
25+
constexpr unsigned char image_binary[] = {
26+
#embed "image.bin"
27+
};
28+
std::cout << std::hex;
29+
for (unsigned char c : image_binary) {
30+
std::cout << static_cast<int>(c) << ' ';
31+
}
32+
std::cout << std::endl;
33+
}
34+
```
35+
このプログラムは、`image.bin`をバイナリデータとして扱い、バイト列を出力している。
36+
37+
つまり、下のプログラムのように`#embed`を使用するとテキストファイルの中身をそのままchar配列に格納していることと同じになる。
38+
```cpp example
39+
int main() {
40+
constexpr char text[] = {
41+
#embed "test.txt"
42+
};
43+
}
44+
```
45+
`#embed`ディレクティブは、他にもパラメータを受け付ける。
46+
```cpp example
47+
int main() {
48+
constexpr unsigned char limited_data[] = {
49+
#embed "data.bin" limit(1024);
50+
};
51+
constexpr unsigned char prefixed_data[] = {
52+
#embed "data.bin" prefix(0x01, 0x02, 0x03)
53+
};
54+
constexpr unsigned char suffixed_data[] = {
55+
#embed "data.bin" suffix(0xFE, 0xFF)
56+
};
57+
constexpr unsigned char safe_data[] = {
58+
#embed "data.bin" if_empty(0x00)
59+
};
60+
}
61+
```
62+
それぞれの変数では、以下のようになっている。
63+
- `limit(1024)`では、読み込むバイトサイズを1024byteに制限する。もしファイルサイズが1024byteよりも大きければ、最初の1024バイトのみが読み込まれる。
64+
- `prefix(0x01, 0x02, 0x03)`では、`data.bin`の内容の前に`0x01 0x02 0x03`のバイト列を追加している。
65+
- `suffix(0xFE, 0xFF)`では、`data.bin`の内容のあとに`0xFE 0xFF`のバイト列を追加している。
66+
- `if_empty(0x00)`では、`data.bin`がからであった場合、`0x00`のバイト列を格納している。
67+
68+
69+
## 参照
70+
- [P1967R14 #embed - a scannable, tooling-friendly binary resource inclusion mechanism](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p1967r14.html)

0 commit comments

Comments
 (0)