两个枚举有一些共同的元素,为什么会产生错误?

时间:2010-01-29 12:44:46

标签: c enums

我的代码中有两个枚举:

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

为什么这么说?我怎么能绕过这个?

8 个答案:

答案 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;
}

Live Example

答案 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;

合并他们成为一个

相关问题