2011-10-29 1 views
6

私は、いくつかのライブラリのC APIを宣言するヘッダファイルを持っています。このライブラリ用のOCamlバインディングを作成したいと思います。私はcamlidlがIDLファイルからスタブを作成できることを発見しましたが、*.hファイルからIDLへの自動変換はないので、CヘッダファイルからOCamlバインディング用のスタブを生成する方法が他にあるのでしょうか?CヘッダファイルからOcamlバインディングスタブを生成する

答えて

6

別の言語のバインディングを書き込むための情報がCヘッダーファイルにありません。非常に単純なケースでは(例えば、すべての関数は整数引数または浮動小数点引数のみを取る)可能ですが、ポインタが関与するとすぐに、より多くの情報を提供する必要があります:関数が指し示された値から読み込み、それとも、その両方?インタフェースはヌルポインタを許可する必要がありますか?これは実際に配列へのポインタですか、そしてサイズはどこですか? char*はゼロ終端文字列へのポインタですか?

IDLはこれらのすべての点をカバーするために、Cの関数宣言を余分な注釈で展開します。だから、camlidlはIDLで動作し、Cヘッダには直接動作しません。あなたは、痛みの少ないものはほとんど見つけられません。

もう1つのアプローチは、空の拡張子を持つマクロであなたのCヘッダーに自由に注釈を付けることですが、追加のタイプ情報を提供します。

int memmove(void ANN_OUT ANN_SIZE(n) ANN_NOT_NULL *dest, 
      const void ANN_IN ANN_SIZE(n) ANN_NOT_NULL *src, 
      size_t n); 

このような注釈は標準化されていないため、このルートに行く場合は独自のツールを作成する必要があります。 (Cを解析する場合は、Cilを参照してください。)代わりに、IDL宣言をプライマリとして扱い、それらからCヘッダファイルを生成することをお勧めします。

関連する問題