Utilisation d'un exemple d'union discriminée XDR

Cette section explique l'exemple d'union discriminée XDR.

Si le type d'une union peut être une structure integer, string (un pointeur de caractère) ou gnumbers et que l'union et son type en cours sont déclarés dans une structure, la déclaration suivante s'applique:

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;
};
Les constructions suivantes et la procédure eXternal Data Representation (XDR) sérialisent et désérialisent l'union discriminée:

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.