C++ ↔ C

観点CC++
オーバーロード手動/アドホック自動
例外-スタックアンワインド
デストラクタ手動クリーンアップデストラクタによる自動処理(RAII)
非POD型-コンストラクタ、vtable、仮想基底を持つオブジェクト
テンプレート-コンパイル時コード生成

C++ には、C には存在せず、FFI に影響を与える機能がいくつかあります:

オーバーロード: 名前マングリングにより、オーバーロードを表現することが不可能になります

例外: FFI 境界で例外を捕捉し、エラーコードに変換しなければ なりません。extern "C" 関数から例外が外へ伝播することは 未定義動作を構成するためです

デストラクタ: C の呼び出し側はデストラクタを実行しないため、明示的な *_destroy() 関数を公開しなければなりません

非POD型: 値渡しは意味をなさないため、FFI 境界をまたいで不透明ポインタを使用 しなければなりません

テンプレート: 直接公開することはできません。明示的にインスタンス化し、各 特殊化をラップする必要があります