一旦创建了C枚举,是否可以为其添加值?

时间:2012-03-16 19:39:57

标签: c enums

我尝试过谷歌搜索它,但没有想出任何东西。有谁知道这是否可以做到?如果不是,有一个优雅的工作吗?

更新:我认为Frank Osterfeld的答案是最明确的解决方案。感谢所有其他答案,我已经提出了你的答案。

6 个答案:

答案 0 :(得分:5)

您无法使用不同的值重新打开相同的枚举:

enum Colors { Red, Blue, Yellow };
enum Colors { Green = 3 }; // ERROR

但是,在C中,所有枚举都可以自动转换为彼此。所以只需创建一个新的枚举,如下所示:

enum Colors { Red, Blue, Yellow };
enum MoreColors { Green = 3 };

int foo()
{
  enum Colors c;
  c = Green; // This will compile
}

答案 1 :(得分:5)

正如其他人所说,你不能重新声明一个枚举(在哪种情况下,应该使用哪一个?)。

如果您只需要一些常量,并希望针对特殊情况扩展它们,则可以使用多个枚举声明,一个扩展另一个,然后使用整数来保存值:

enum Error { NoError=0, AllIsBroken, WhatTheHellAreYouDoing, UserDefinedError };

enum NetworkError { HostNotFound=UserDefinedError+1, ConnectionTimeout, ... };

int error = HostNotFound;

if ( error == NoError )
    ...
if ( error == HostNotFound )
    ...

答案 2 :(得分:4)

没有;枚举类型完成后,您无法扩展它:

enum Blarney { Kirkpatrick, Donegal, Ireland };

enum Blarney { Eire = 3 };  // Not allowed!

在某个层面上没有针对它的解决方法。在另一个级别,您只需使用int值来保存枚举中的项目:

enum Blarney { Kirkpatrick, Donegal, Ireland };
enum BlarneyX { Eire = 3 };

void function(void)
{
    enum Blarney b = Kirkpatrick;
    int y = Kirkpatrick;

    y = Eire;
    y = Donegal;
    switch (y)
    {
    case Kirkpatrick:
    case Donegal:
         printf("Something\n");
         break;
    case Eire:
         printf("Different\n");
         break;
    }

    switch (b)
    {
    case Kirkpatrick:
         printf("Kirkpatrick\n");
         break;
    case Donegal:
         printf("Donegal\n");
         break;
     }
     ...
}

编译器可能会警告您错过了第二个Ireland中的案例switch;它不能用第一个这样做。

答案 3 :(得分:2)

没有。正如其他人所说,C enum是编译时的事情。

在某些语言中,例如Javascript,您可以创建被视为枚举的对象。例如:

var Colors = { "Red":0xf00, "Blue":0x00f, "Green":0x0f0 };
Colors["Cyan"]=0x0ff;

var bgColor = Colors.Red;

如果你需要模拟这种将字符串映射到C(而不是C ++)中的值的方法,你需要某种树或哈希表,它不是C标准库的一部分。在C ++中,只需使用std::map<std::string, int>

答案 4 :(得分:1)

“一旦创建”是什么意思?枚举是 types ,它们在编译时“创建”。 但由于所有枚举共享相同的“命名空间”(C中不存在的概念),因此您可以单独声明其他枚举。但是,你不能“重新声明”枚举。

答案 5 :(得分:1)

不,你不能添加'enum',因为在编译使用这些值的翻译单元时,可以用常量替换值,具体取决于调试选项,优化等。此外,可能会引用什么已编译的翻译单元中的新值?你必须重新编译。