Перечисления

typedef enum {
    InfoKindVersion,
    InfoKindName
} InfoKind;

//tagged union: the payload depends
//on the kind
typedef struct {
    InfoKind kind;
    union {
        struct {
            int major, minor, build;
        } version;
        char name[41];
    } payload;
} ProgramInfo;

void printInfo(ProgramInfo info) {
    switch (info.kind) {
        case InfoKindVersion:
            NSLog(@"version: %d.%d.%d",
                info.payload.version.major,
                info.payload.version.minor,
                info.payload.version.build);
            break;
        case InfoKindName:
            NSLog(@"name: %s",
                info.payload.name);
            break;
    }
}

ProgramInfo info;
info.kind = InfoKindName;
strcpy(info.payload.name"CCDEditor");
printInfo(info);

info.kind = InfoKindVersion;
info.payload.version.major = 3;
info.payload.version.minor = 5;
info.payload.version.build = 25467;
printInfo(info);