|
| 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