我尝试过谷歌搜索它,但没有想出任何东西。有谁知道这是否可以做到?如果不是,有一个优雅的工作吗?
更新:我认为Frank Osterfeld的答案是最明确的解决方案。感谢所有其他答案,我已经提出了你的答案。
答案 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',因为在编译使用这些值的翻译单元时,可以用常量替换值,具体取决于调试选项,优化等。此外,可能会引用什么已编译的翻译单元中的新值?你必须重新编译。