在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
被视为第一个值,因此最终会有不同符号的重复整数值。
答案 0 :(得分:5)
唯一关心的是积分常数是唯一的。只需将第二个enum
的第一个元素指定给第一个enum
的最后一个元素加一个。
enum abc { A, B, C, };
enum def { D = C + 1, E, F };