Utilisation d'un exemple d'union discriminée XDR
Cette section explique l'exemple d'union discriminée XDR.
enum utype { INTEGER=1, STRING=2, GNUMBERS=3 };
struct u_tag {
enum utype utype; /* the union's discriminant */
union {
int ival;
char *pval;
struct gnumbers gn;
} uval;
};
struct xdr_discrim u_tag_arms[4] = {
{ INTEGER, xdr_int },
{ GNUMBERS, xdr_gnumbers }
{ STRING, xdr_wrap_string },
{ __dontcare__, NULL }
/* always terminate arms with a 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));
}
La sous-routine xdr_gnumbers est présentée dans la rubrique Transmission de listes liées à l'aide de l'exemple XDR. La sous-routine xdr_wrap_string est présentée dans l'exemple D de la rubrique Utilisation d'exemples de tableau XDR. Le paramètre arms par défaut du paramètre xdr_union estNULLdans cet exemple. Par conséquent, la valeur du discriminant du syndicat peut légalement ne prendre que les valeurs énumérées dans lau_tag_armstableau. Cet exemple montre également que les éléments de laarmsn'ont pas besoin d'être triés.
Les valeurs du discriminant peuvent être clairsemées (mais pas dans cet exemple). Il est recommandé d'affecter des valeurs entières explicites à chaque élément du type du discriminant. Cette pratique documente la représentation externe du discriminant et garantit que différents compilateurs C émettent des valeurs discriminantes identiques.