Rust ↔ C
| 観点 | Rust | C |
|---|---|---|
| エラー | Result<T, E>, Option<T> | 特別な戻り値、出力パラメータ、グローバル errno |
| 文字列 | &str/String(UTF-8、長さが分かる) | ヌル終端の char*、エンコーディングは未定義 |
| ヌル許容性 | Option<T> により明示 | どのポインタも null になりうる |
| 所有権 | アフィン型、ライフタイム | 慣習 |
| コールバック | Fn/FnMut/FnOnce クロージャ | 関数ポインタ + void* userdata |
| パニック | スタックアンワインド(または abort) | abort |
エラー: C の慣習に従うために Result を変換しなければならない。C 側では エラーの確認を忘れやすい。
文字列: 変換コストがかかる。Rust の文字列中のヌルバイトは切り詰めを引き起こす。 入力時には UTF-8 の検証が必要。
ヌル許容性: Option<NonNull<T>> を作るには、C からのすべてのポインタを検査 しなければならず、unsafe ブロックまたは実行時コストを伴う。
所有権: オブジェクトのライフタイムを手動で文書化し、保証しなければならない。
コールバック: クロージャを fn ポインタ + コンテキストに分解しなければならない。コンテキストの ライフタイムは手動管理となる。
パニック: FFI 境界をまたぐパニックは未定義動作であり、境界で catch_unwind によって捕捉しなければならない。