C++ ↔ C
| 観点 | C | C++ |
|---|---|---|
| オーバーロード | 手動/アドホック | 自動 |
| 例外 | - | スタックアンワインド |
| デストラクタ | 手動クリーンアップ | デストラクタによる自動処理(RAII) |
| 非POD型 | - | コンストラクタ、vtable、仮想基底を持つオブジェクト |
| テンプレート | - | コンパイル時コード生成 |
C++ には、C には存在せず、FFI に影響を与える機能がいくつかあります:
オーバーロード: 名前マングリングにより、オーバーロードを表現することが不可能になります
例外: FFI 境界で例外を捕捉し、エラーコードに変換しなければ なりません。extern "C" 関数から例外が外へ伝播することは 未定義動作を構成するためです
デストラクタ: C の呼び出し側はデストラクタを実行しないため、明示的な *_destroy() 関数を公開しなければなりません
非POD型: 値渡しは意味をなさないため、FFI 境界をまたいで不透明ポインタを使用 しなければなりません
テンプレート: 直接公開することはできません。明示的にインスタンス化し、各 特殊化をラップする必要があります