用其他值扩展枚举

pic*_*ick 4 c enums

扩展enumin 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;
}
Run Code Online (Sandbox Code Playgroud)

这不会与“重复大小写值”错误一起编译,据我所知,因为abc它被视为第一个值,所以对于不同的符号,它最终会出现重复的整数值。

Dei*_*Dei 5

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

enum abc { A, B, C, };     
enum def { D = C + 1, E, F }; 
Run Code Online (Sandbox Code Playgroud)

  • 而是:`enum abc { A, B, C, n }; enum def { D=n, E, F };` 所以常量 `C` 和 `def` 之间没有紧密耦合。将枚举中的最后一项作为计数器而不是常量是常见的做法。 (3认同)
  • @PatrickAllaert 这很常见;几乎每个枚举末尾都有一个计数器变量。另一个巨大的好处是它们可以用来确保枚举和具有命名索引的查找表之间的完整性。假设你有 `const int TABLE [n] = ...` - 现在你可以 `_Static_assert(sizeof(TABLE) / sizeof(*TABLE) = n, ...`。坚固、可读、安全。 (2认同)