使用其他值

时间:2018-05-16 03:06:04

标签: c enums

在C中扩展enum的常见做法是什么?我有来自其他包含的enum个,并希望使用一些值来扩展它们。希望以下示例为我想要实现的目标提供直觉。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

enum abc { A, B, C, };     /* from some other include */
enum def { abc, D, E, F }; /* extend enum from other include */

struct thing_s {
    enum def kind;         /* use extended enum */
    union {
        unsigned n;
        char c;
        char *str;
    } data;
};

void print_thing(struct thing_s *t) {
    switch (t->kind) {
        case A:
            fprintf(stdout, "%ul\n", t->data.n);
            break;
        case B:
        case C:
        case D:
            fprintf(stdout, "%s\n", t->data.str);
            break;
        case E:
        case F:
            fprintf(stdout, "%c\n", t->data.c);
            break;
        default:
            assert(0);
    }
}

int main(int argc, char *argv[]) {

    struct thing_s t;
    t.kind = A;
    t.data.n = 1;

    print_thing(&t);

    return EXIT_SUCCESS;
}

这不会用&#34;重复的案例值&#34;进行编译。错误,我理解,因为abc被视为第一个值,因此最终会有不同符号的重复整数值。

1 个答案:

答案 0 :(得分:5)

唯一关心的是积分常数是唯一的。只需将第二个enum的第一个元素指定给第一个enum的最后一个元素加一个。

enum abc { A, B, C, };     
enum def { D = C + 1, E, F };