枚举的组成

时间:2011-05-03 22:10:34

标签: c

有没有办法在C中制作多个枚举的组合? 我希望有一个将在其他枚举中使用的公共枚举。

例如,我想写下面的代码:

enum common_e {
   COMMON_LITERAL_0,
   COMMON_LITERAL_1
}

enum first_e {
   common_e, // <- Somehow I would like to have the two common_e's literals here
   FIRST_LITERAL_0,
}

enum another_e {
   common_e, // <- Somehow I would like to have the two common_e's literals here
   ANOTHER_LITERAL_0,
   ANOTHER_LITERAL_1
}

我担心的是在子动画中将公共文字保持为相同的顺序,因为它们被用作函数指针数组的ID。

有解决办法吗?

5 个答案:

答案 0 :(得分:6)

enum未命名空间,因此您不能拥有两个具有相同名称的枚举数。所以不,即使使用预处理器或其他魔法,也不能这样做。

如果您只是希望枚举值继续保留常用的值,那么如何:

enum common_e {
    COMMON_LITERAL_0,
    COMMON_LITERAL_1,
    COMMON_LITERAL_END__
};

enum first_e {
    FIRST_LITERAL_0 = COMMON_LITERAL_END__,
    FIRST_LITERAL_1
};

答案 1 :(得分:4)

这样的事情:

enum common_e {
   COMMON_LITERAL_0,
   COMMON_LITERAL_1,
   COMMON_MAX
}

enum first_e {
   FIRST_LITERAL_0 = COMMON_MAX,
}

enum another_e {
   ANOTHER_LITERAL_0 = COMMON_MAX,
   ANOTHER_LITERAL_1
}

答案 2 :(得分:2)

嗯,你可以可以想象做这样的事情:

#define COMMON_E(N) N##_COMMON_LITERAL_0, \
                    N##_COMMON_LITERAL_1

enum first_e {
   COMMON_E(FIRST), // <- Somehow I would like to have the two common_e's literals here
   FIRST_LITERAL_0,
};

enum another_e {
   COMMON_E(ANOTHER), // <- Somehow I would like to have the two common_e's literals here
   ANOTHER_LITERAL_0,
   ANOTHER_LITERAL_1
};

虽然我不确定这会带来什么好处......

问题是枚举不是命名空间,因此你必须提供不同的名称(因此是宏参数)。

答案 3 :(得分:0)

这在C中是不可能的。您只需要定义多个枚举。

答案 4 :(得分:0)

你无法准确地完成你的要求,但你可以做一些几乎同样好的事情。这些解决方案中的每一个都依赖于设置特定枚举成员的值的能力。

您可以将所有姓名放在一个枚举中:

enum every_e {
   // common values
   COMMON_LITERAL_0,
   COMMON_LITERAL_1,
   MAX_COMMON_LITERAL = COMMON_LITERAL_1,

   // First set of extra values
   FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1,
   FIRST_LITERAL_1,
   FIRST_LITERAL_2,

   // Second set of extra values
   ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1,
   ANOTHER_LITERAL_1
};

如果你想使用不同的枚举类型,你可以使用相同的技巧:

enum common_e {
   COMMON_LITERAL_0,
   COMMON_LITERAL_1,
   MAX_COMMON_LITERAL = COMMON_LITERAL_1
};

enum first_e {
   FIRST_LITERAL_0 = MAX_COMMON_LITERAL+1,
};

enum another_e {
   ANOTHER_LITERAL_0 = MAX_COMMON_LITERAL+1,
   ANOTHER_LITERAL_1
};