Расширить enum дополнительными значениями - PullRequest
0 голосов
/ 16 мая 2018

Какова общая практика для расширения enum в C?У меня есть enum s из других включений, и я хотел бы расширить их несколькими значениями.Надеемся, что в следующем примере представлена ​​интуиция для того, чего я хотел бы достичь.

#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;
}

Это не компилируется с ошибками «дублирующихся значений регистра», которые я понимаю, потому что abc рассматривается какпервое значение, поэтому оно заканчивается дублирующимися целочисленными значениями для различных символов.

1 Ответ

0 голосов
/ 16 мая 2018

Ваша единственная задача - чтобы интегральные константы были уникальными. Просто назначьте первый элемент вашего второго enum последнему элементу вашего первого enum плюс один.

enum abc { A, B, C, };     
enum def { D = C + 1, E, F }; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...