3

不透明なポインター/ハンドルを使用して C から C++ オブジェクトを管理するために既に作成されたライブラリ/ヘッダーはありますか?

自分で作成することもできますが、特に fortran バインディングがある場合は、既に作成されたソリューションを使用したいと思います。

私の特定の要件は次のとおりです。

  • ラッパー生成機能 (私の考えでは、ブースト プリプロセッサを使用することです)
  • ハンドルの検証と特別な値、および 64 ビット Fortran での移植性を提供するために、(生のポインターではなく) 整数ハンドル (lampi 風) を介してオブジェクトを処理します。

ありがとう

4

2 に答える 2

4

C++ では、単純に関数を提供する

Foo foo; // C++ object we want to access

Foo &foo_factory(); // C++ function we want to call

extern "C" void * get_foo() // extern "C" so C can call function
    { return (void *) & foo; } // cast it to an opaque void * so C can use it

extern "C" void * create_foo()
    { return (void *) & foo_factory(); }

および C ヘッダー

extern void * get_foo();
extern void * create_foo();

適切なアクセサとの間でキャストをvoid*行うだけで十分です。

Fortran コンパイラが と互換性があるextern "C"か (特に C スタティック ライブラリと互換性がある場合)、または C++ コンパイラがextern "Fortran". それらのマニュアルを参照してください。

これを行うためのコード ジェネレーターを見つけることができる場合があります。可能であれば、もちろん手動で行う方が安全です。

于 2010-04-25T18:17:57.303 に答える
0

C に似たインターフェースを作成したら、Fortran バインディングの場合、おそらく ISO C バインディングを使用して、Fortran コンパイラーに C インターフェースを呼び出す方法を指示できます。一般に、ISO C Binding は、Fortran と C を双方向でインターフェースするための標準的で移植可能な方法を提供しますが、両方の言語にはサポートされていない機能がいくつかあります。以下は、Fortran バインディングをセットアップするために (テストされていない) 動作するインターフェイスの例です。

module my_fortran_binding

use iso_c_binding

implicit none

interface get_foo_interf

   function get_foo () bind (C, name="get_foo")

      import

      type (C_PTR) :: get_foo

   end function get_foo

end interface get_foo_interf


interface create_foo_interf
  etc....
end create_foo_interf

end module my_fortran_binding
于 2010-04-25T19:43:14.067 に答える