2012-03-16 8 views
3

私はGoogleの検索を試みたが、何も出てこなかった。これができるかどうか誰にも分かりますか?そうでない場合は、この周りにエレガントな作業ですか?作成したC enumに値を追加できますか?

更新:私はFrank Osterfeldの回答が最も明確な解決策だと思います。他のすべての答えをありがとう、私はあなたの答えをupvotedしました。

+4

あなたは何を意味するのか正確に? 'enum'はコンパイル時のものです。実行時には、整数値のみが存在します。 「enumを作成する」とはあなたにとって何を意味しますか?それはいつあなたのために起こるのですか? –

+1

なぜこれをやろうとしていますか?少しの文脈が役立ちます。 Bascially列挙型は、トランプ、年の月、曜日などのコレクションです。マネージャーができると思うにもかかわらず、余分な曜日を週に追加することはできません! –

+0

@Ed:ok、土曜日に来る必要があります。 – bernie

答えて

5

他にも述べたように、enumを再宣言することはできません(どのコンテキストでどちらを使用する必要がありますか?)。

あなただけのいくつかの定数を必要とし、特殊なケースのためにそれらを拡張したい場合、あなたは、複数のenum宣言を使用することができ、一方が他方を拡張して、値を保持するためにint型を使用します。

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

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

int error = HostNotFound; 

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

私はこれが最も明確な解決策だと思います。他のすべての答えをありがとう、私はあなたの答えをupvotedしました。 – mihajlv

4

いいえ;列挙型が完了したら、それを拡張することはできません。

あるレベルでは回避策はありません。別のレベルでは、単に列挙からアイテムを保持するために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

1

「一度作成された」とはどういう意味ですか?列挙型はタイプであり、コンパイル時に「作成」されます。 しかし、すべてのenumは同じ "namespace"(Cにはない概念)を共有しているので、他のenumを単独で宣言できます。ただし、列挙型を「再宣言」することはできません。あなたが別の値と同じ列挙型再度開くことができません

5

:Cで

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

を、しかし、すべての列挙型はお互いに自動的に変換可能です。だからこのように、新しい列挙型を作成します。

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

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

いいえ、あなたは「列挙型」に追加することはできませんが、これらの値を使用して翻訳単位がコンパイルされたときの値は定数と置き換えることができるので、依存デバッグオプション、最適化などについては、既にコンパイルされた翻訳単位で新しい値を参照する可能性があります。再コンパイルする必要があります。

2

他の人が言っているように、C enumはコンパイル時のものです。

JavaScriptのように、一部の言語では、列挙型として扱われるオブジェクトを作成できます。例:あなたがC(ないC++)の値にマッピング文字列のこの方法をシミュレートする必要がある場合は

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

var bgColor = Colors.Red; 

は、あなたがC標準ライブラリの一部ではありませんツリーまたはハッシュテーブルのいくつかの並べ替えをする必要があります。 C++では、std::map<std::string, int>を使用してください。

関連する問題