2012年1月21日土曜日

XSとC++で文字列のやりとり

PerlでC/C++ライブラリを使うときには、XSでラッパーを書いてあげる必要があります。C++はオブジェクトになっているものがあるので、ちょっと手間がかかるのです。

C++の関数を実行し、文字列をPerlへ返すとき

cpplibという名前のライブラリに、実行するとstd::stringを返す関数func1()があったとします。これをXSのなかで実行させて、文字列をPerlへ返すときは、次のように書けます。

SV *
cpplib::func1()
 PREINIT:
  std::string s;
 CODE:
  s = THIS->func1();
  RETVAL = newSVpv( s.c_str(), s.length() );
 OUTPUT:
  RETVAL

まず、PREINIT欄。func1()を実行したときの返り値の受け皿として、std::stringの変数をひとつ用意しておきます。

CODE欄でfunc1()を実行し、さっきの受け皿変数に保存。これをPerlの何でもありな変数に変換するのが次の行なのです。RETVALはPerlへの返り値専用の変数で、宣言は不要です。このRETVALに、C/C++の文字列からPerlのスカラー変数(SV)を生成する関数(newSVpv)を通してあげればOKなのです。

newSVpvは引数1つ目にstd::stringの文字列部分、2つ目に文字列の長さを与えることで、Perlのスカラー変数に文字列を代入した状態のものを返します。newSVpvのpvが文字列を表しており、例えば整数型ならnewSVivを使うといった具合に、C/C++側の変数型にあわせて使い分ける必要があります。

Perlから文字列を渡し、C++の関数の引数とするとき

これから書く

0 件のコメント:

コメントを投稿