我的代码中有两个枚举:
enum Month {January, February, March, April, May, June, July,
August, September, October, November, December};
enum ShortMonth {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
May
是两个枚举中的常见元素,因此编译器会说:
重新声明枚举器“
May
”。
为什么这么说?我怎么能绕过这个?
答案 0 :(得分:35)
枚举名称属于全局范围,它们必须是唯一的。请记住,您不需要使用枚举名称限定枚举符号,只需:
Month xmas = December;
不
Month xmas = Month.December; /* This is not C. */
出于这个原因,您经常会看到人们在符号名称前加上枚举名称:
enum Month { Month_January, Month_February, /* and so on */ };
答案 1 :(得分:29)
我建议你合并两个:
enum Month {
Jan, January=Jan, Feb, February=Feb, Mar, March=Mar,
Apr, April=Apr, May, Jun, June=Jun,
Jul, July=Jul, Aug, August=Aug, Sep, September=Sep,
Oct, October=Oct, Nov, November=Nov, Dec, December=Dec};
效果完全相同,更方便。
如果您希望1月份的值为1而不是0,请添加以下内容:
enum Month {
Jan=1, January=Jan, Feb, February=Feb, ....
答案 2 :(得分:13)
在C ++中,为避免名称冲突,您可以将枚举包装到结构中:
struct Month { enum {January, February, March, April, May, June, July,
August, September, October, November, December}; };
struct ShortMonth { enum {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; };
答案 3 :(得分:7)
什么放松说。但我还想说你的例子似乎是一个非常不寻常的使用枚举。我看不出让ShortMonth和LongMonth都指向同一个东西的价值 - 这对字符串有意义,但对于枚举则没有意义。为什么不只有一个月枚举类型?
答案 4 :(得分:3)
我的建议是只有一个枚举,因为它们属于同一类型。如果你想在代码中输入较少的短别名(即使我不建议你这样做),你可以这样做:
enum Month {
January, Jan = January,
February, Feb = February,
March, Mar = March,
April, Apr = April
May,
June, Jun = June,
July, Jul = July,
...};
要拥有不同的表示名称(短名称和长名称),您应该有两个不同的字符串数组,这些数组由枚举索引。
char[MAX_MONTH_NAME_LENGTH][12] month_long_names = {
"January", "February", ...
}
char[3][12] short_long_names = {
"Jan", "Feb", ...
}
printf("month %d long name is %s, and short name is %s\n", May, long_month_names[May], short_month_names[May]);
答案 5 :(得分:1)
在C枚举中使用没有任何类型前缀,所以你写:
month[0] = January;
month[4] = May;
枚举Month和ShortMonth具有相同的范围,因此编译器无法知道要使用哪个May。一个明显的解决方法是为枚举添加前缀,但我不确定在这种情况下你是否有必要使用这些枚举。
答案 6 :(得分:1)
在C ++ 11中,您可以使用scoped enumerations来解决此问题。这将从全局范围中删除名称,并将它们范围限定为枚举名称。
enum class Identity
{
UNKNOWN = 1,
CHECKED = 2,
UNCHECKED =3
};
enum class Status
{
UNKNOWN = 0,
PENDING = 1,
APPROVED = 2,
UNAPPROVED =3
};
int main ()
{
Identity::UNKNOWN;
Status::UNKNOW;
}
答案 7 :(得分:-2)
typedef enum {Jan, January, Feb, February, Mar, March, Apr, April, May, Jun, June, Jul, July,
Aug, August, Sep, September, Oct, October, Nov, November, Dec, December} Month,ShortMonth;
合并他们成为一个