関数の異常を示すために、状態変数を別に用意するよりも、単に`undef'
値や空リストを返したい場合があります。 rpcb_gettime()
関数を、そ
のような場合にあてはめてみましょう。この関数がうまくいったときには、時刻
を返し、問題があったときには、 `undef' 値を返すようにしてみましょう。
次の Perl コードでは、 $timep の値が `u' か有効な時刻のどちら
かになることになります。
$timep = rpcb_gettime( "localhost" );
次の XSUB では、関数型に void
を用いて、RETVAL 変数を作らないよう
にし、 CODE:
ブロックを使って、必要なコードはすべて用意しているこ
とをコンパイラに示しています。 sv_newmortal()
の呼び出しで返却値
を `undef' で初期化し、これをデフォルトの返却値としています。
void rpcb_gettime(host) char * host CODE: { time_t timep; bool_t x; ST(0) = sv_newmortal(); if( rpcb_gettime( host, &timep ) ) sv_setnv( ST(0), (double)timep); }
次の例では必要となったときに、明示的に `undef' 値を返却値として設定 する方法を示します。
void rpcb_gettime(host) char * host CODE: { time_t timep; bool_t x; ST(0) = sv_newmortal(); if( rpcb_gettime( host, &timep ) ){ sv_setnv( ST(0), (double)timep); } else{ ST(0) = &sv_undef; } }
空リストを返すには、 PPCODE:
ブロックを使ったうえで、スタック上に
返却値を積まないでおきます。
void rpcb_gettime(host) char * host PPCODE: { time_t timep; if( rpcb_gettime( host, &timep ) ) PUSHs(sv_2mortal(newSVnv(timep))); else{ /* スタックに何も積まないので、 */ /* 暗黙のうちに空リストが返される。 */ } }
Go to the first, previous, next, last section, table of contents.