2011-07-05 10 views
4

内のすべてのアイテムは、サイクルにそれが可能であり、例えば、列挙型ですべてのアイテムのためにその値を抽出します。サイクルは、列挙型

enum { 
    item 1 = 1, 
    item 2 = 7, 
    item 3 = 'B' 
} items; 

を、配列を言うために。可能?

+0

可能重複://stackoverflow.com/questions/261963/c-iterate-through-an-enum) – Vladimir

答えて

8

列挙型の各値に対して1つの要素を持つ配列を作成することを意味しますか?あなたは配列{1, 7, 'B'}に終わるだろうか?

できません。列挙型はコンパイル時定数の束ではありません。実行時には、それらは実質的にただintです。コンパイラは、enum変数に有効な値を入れていることを確認することさえしません(値5を入れても構いません)。したがって、実行時に可能な列挙値が何であるかについての知識はありません。

もちろん、enumが連続している場合(たとえば、値0,1,2,3の列挙型を定義していた場合)、forループを使用してこれを行うことができます。

2

これは期待通りの方法ではありません。列挙型のメンバーに連番を割り当てると仮定すると、ループを使用して値を反復処理できます。残念ながら、これはあなたができる最高のものです。より詳細な説明については、this answerを参照してください。

3

それはできません。 enum項目は単に定数であり、類推は#define Dの定数であってもよい:

#define item_1 1 
#define item_2 7 
#define item_3 'B' 

(警告、#defineenumは等しくない。これは、ちょうど類似です。)。

2

あなたの列挙型の項目を明示的連続した値のような与えることができる:(

enum { 
    item1=0, 
    item2=1, 
    numberOfItems=2 
} myEnum; 

、その後サイクル

for (k=item1; k<=numberOfItems; k++) 

としてではなく、それは myEnumが連続していることを確認するためにあなたに最高のコースでありますつまり、このように循環しようとする値が含まれています)。

+0

ちょうどあなたの更新を見ましたが、この非連続的なケースでは不可能です – fnokke

2

あなたはかなり一般的なシナリオで実際のアプリケーションでこれを実行する必要がある場合は、次のようにそれを行うだろう:(HTTP:[列挙型を反復処理C++]の

#define ITEM_N 3 

typedef enum 
{ 
    item1 = 1, 
    item2 = 7, 
    item3 = 'B', 
} Item_t; 

const Item_t LOOKUP_TABLE [ITEM_N] = 
{ 
    item1, 
    item2, 
    item3 
}; 

... 

for(i=0; i<ITEM_N; i++) 
{ 
    printf("%d\n", LOOKUP_TABLE[i]); 
}