Unions erlauben es uns einen spezialisierten Datentypen zu erschaffen, der anstelle mehrere Datentypen eingesetzt werden kann. Einen solchen Typen nennt man "Variant". 

Ein Variant kommt überall dort zum Einsatz, wo verschiedene Eingangsdaten auf die selbe Art und Weise gespeichert werden sollen, ohne dabei ihren konkreten Typen zu verlieren. Im folgenden Beispiel kann der Variant int, short int und double korrekt speichern. 

Da eine Union keinen Hinweis darauf trägt, welches Feld gerade in Verwendung ist, wird sie zur Erstellung eines Variants typischerweise in einer Struktur gekapselt. Diese Struktur speichert neben der Union die Zusatzinformation, welches Feld in Verwendung ist. Im Beispiel kommt dabei ein int zum Einsatz. Zur besseren Lesbarkeit werden Präprozessor-Defines verwendet. 

#include <stdalign.h>
#include <stdio.h>

#define VARIANTTYPE_INT 0
#define VARIANTTYPE_DOUBLE 1
#define VARIANTTYPE_SHORT 2

struct variant {
    union {
        int i;
        double d;
        short int s;
    };
    int type;
};

void print_variant(struct variant var)
{
    if (var.type == VARIANTTYPE_INT) {
        printf("INT: %d\n", var.i);
    }
    if (var.type == VARIANTTYPE_DOUBLE) {
        printf("DOUBLE: %f\n", var.d);
    }
    if (var.type == VARIANTTYPE_SHORT) {
        printf("SHORT: %d\n", var.s);
    }
}

int main()
{
    struct variant var1 = { .i = 42, .type = VARIANTTYPE_INT };
    struct variant var2 = { .d = 13.37, .type = VARIANTTYPE_DOUBLE};
    struct variant var3 = { .s = 12, .type = VARIANTTYPE_SHORT};

    print_variant(var1);
    print_variant(var2);
    print_variant(var3);

    printf("sizeof(struct variant) : %zd\n", sizeof(struct variant));
    printf("alignof(struct variant): %zd\n", alignof(struct variant));

    return 0;
}
Zuletzt geändert: Freitag, 18. Mai 2018, 17:27