ONC+ 開発ガイド

識別型の共用体サンプルプログラム

共用体のデータ型は、整数、文字へのポインタ (文字列)、gnumbers 構造体のどれかで、共用体と現在の型は構造体で宣言されています。 宣言は次のようになります。

enum utype {INTEGER=1, STRING=2, GNUMBERS=3};
struct u_tag {
   enum utype utype;	/* 共用体の要素識別子 */
   union {
      int ival;
      char *pval;
      struct gnumbers gn;
   } uval;
};  

次のサンプルプログラムでは、XDR プロシージャを構築し、識別型の共用体をデシリアライズします。


例 A–12 XDR 識別型の共用体サンプルプログラム

struct xdr_discrim u_tag_arms[4] = {
 	{INTEGER, xdr_int},
 	{GNUMBERS, xdr_gnumbers}
 	{STRING, xdr_wrapstring},
 	{__dontcare__, NULL}
 	/* arm の最後は常に NULL の xdr_proc */
 }
 
bool_t
xdr_u_tag(xdrs, utp)
 	XDR *xdrs;
 	struct u_tag *utp;
{
 	return(xdr_union(xdrs, &utp->utype, &utp->uval,
	       u_tag_arms, NULL));
}

ルーチン xdr_gnumbers()XDR ライブラリ 内で説明しました。 この例では、xdr_union() のデフォルトの arm 引数 (最後の引数) には、 NULL を渡しています。 したがって、共用体の要素識別子の値は、u_tag_arms 配列に表示された値のどれかになります。例 A–12 もまたアームの配列内要素をソートする必要がないことを示しています。

要素識別子は、この例では連続した値をとっていますが、連続しない値でも構いません。要素識別子の型の各要素に、明示的に整数値を割り当てておくと、要素識別子の外部表現として明記でき、異なる C コンパイラでも要素識別子が同じ値で出力されることが保証されます。