PostgreSQL 9.0.4文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 35章SQLの拡張 | 早送り | 次のページ |
以下のガイドラインに従うことで、PostgreSQLの拡張を構築するためC++モードのコンパイラを利用できます。
バックエンドからアクセスされる関数はすべてバックエンドに対してCインターフェースを提供しなければなりません。 このC関数はC++関数を呼びだすことができます。 例えば、バックエンドからアクセスされる関数にはextern Cリンクが必要です。 これはバックエンドとC++コードの間でポインタとして渡される関数にも必要です。
適切な解放メソッドを使ってメモリを解放してください。
例えば、ほとんどのバックエンドメモリーはpalloc()
で確保されますので、pfree()
を使って解放してください。すなわち、その場合にC++のdelete()
を使うと失敗するでしょう。
例外がCコードへ伝播しないようにしてください(extern C関数すべての最上位ですべての例外を捕捉するブロックを使ってください)。
メモリ不足のようなイベントにより例外が発生する可能性がありますので、C++コードが何も例外を発生させない場合であっても、これは必要です。
可能であれば、例外を完全に除去できるように-fno-exceptionsを付けてC++をコンパイルしてください。
その場合、例えばnew()
で返されるNULLの検査など、C++コード内で失敗の検査を行わなければなりません。
C++コードからバックエンド関数を呼び出す場合には、C++呼び出しスタック内にC言語互換構造体(POD)のみが含まれていることを確認してください。
バックエンドのエラーは、非PODオブジェクトを持つC++呼び出しスタックを適切に戻すことができない、長距離longjmp()
を生成しますので、これは必要です。
まとめると、バックエンドとやりとりするための壁の役割を担うextern C関数の背後にC++コードを配置して、例外、メモリ、呼び出しスタックそれぞれの漏れを避けるのが最善です。