2012-03-16 91 views
3

我試過谷歌搜索它,但沒有提出任何東西。有誰知道這是否可以做到?如果沒有,這是否有一個優雅的工作?一旦創建了C枚舉值,你可以添加值嗎?

更新:我認爲弗蘭克奧斯特費爾德的答案是最明確的解決方案。感謝所有其他答案,我已經提出了你的答案。

+4

你是什麼意思究竟? 'enum'是編譯時的東西。在運行時,只有整數值存在。 「創建枚舉」是什麼意思?什麼時候發生,爲了你? – 2012-03-16 19:42:10

+1

你爲什麼要這麼做?有一點上下文會有所幫助。 Bascially枚舉是一系列事物 - 玩紙牌,一年中的幾個月,一週中的某一天等等。儘管經理認爲他們可以,但您無法在每週添加額外的一天。 – 2012-03-16 19:43:41

+0

@Ed:好的,那麼我需要你在星期六 – bernie 2012-03-16 19:46:05

回答

5

正如別人所說,你不能重新聲明一個枚舉(在哪個上下文中,哪一個應該被使用?)。

如果你只是需要一些常數,並希望延長他們的特殊情況下,可以使用多個enum聲明,一個延伸至另一然後用整數來保存值:

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

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

int error = HostNotFound; 

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

我認爲這是最清晰的解決方案。感謝所有其他答案,我已經提出了你的答案。 – mihajlv 2012-03-16 20:22:27

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; 
    } 
    ... 
} 

編譯器可能會警告你在第二switch錯過了的情況下Ireland;第一個不能這樣做。

+0

+1 happy st。帕蒂的一天 – bernie 2012-03-16 19:45:00

1

「一旦創建它」是什麼意思?枚舉是類型,它們是在編譯時「創建」的。 但由於所有的枚舉共享相同的「名稱空間」(C中不存在的概念),因此可以獨立聲明其他枚舉。但是,您不能「重新聲明」枚舉。

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

不,你不能添加到「枚舉」,因爲該值可以用常數來代替使用這些值轉換單元被編譯時,根據在調試選項,優化等方面。此外,什麼可能會引用已編譯翻譯單元中的新值?你必須重新編譯。

2

否如其他人所說,C枚舉是編譯時的事情。

在某些語言中,比如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>即可。