2016-10-26 19 views
0

列挙型のフィールドの値を固定数で増やすことはできますか?Cで固定数で列挙型の値を増やす

言う私が列挙

typedef enum { 
    VAL_A, 
    VAL_B, 
    VAL_C 
}ENUM_X; 

を持っている場合、私は値が(デフォルトである1以外)の固定数でインクリメントすることができるように列挙型を定義します。これは、上記の答えは真であり、そのような仕組みがあれば、それは値が順次インクリメントすることが可能でしょうか?また

VAL_A = 4; VAL_B = 8; VAL_C = 12; 

(のは数が4であるとしましょう)を持つ私につながりますか

は、私は同じ列挙型が

typedef enum { 
    #ifdef A 
    VAL_A, 
    #endif 

    #ifdef B 
    VAL_B, 
    #endif 

    #ifdef C 
    VAL_C, 
    #endif 

    VAL_END 
}ENUM_X; 

として再定義しましたそして、上記列挙のために、私はAとCを定義した場合、私は

VAL_A = 4; VAL_C = 8; 

を取得する必要があります言うしかし、私はBとCを定義した場合、私は

VAL_B = 4; VAL_C = 8; 

を取得する必要がありますそして、私はすべてのA、BおよびCを定義した場合、私は

を取得する必要があります
VAL_A = 4; VAL_B = 8; VAL_C = 12; 
+3

これを行う方法を考えると、数字を自分で書き込むよりも複雑になります。 – DeiDei

+1

Cに列挙値のカスタムステッピングはありません。これはプラスの値か、明示的に設定した値です。 –

答えて

4

いいえ、このようなサポートはありません。

もちろん、マクロを使って多少の恐怖を感じるかもしれません。私は「自動」部分全体が面倒だと思っていますが、動機が十分に取れれば、最も面倒なプリプロセッサ構造を思いつくことができます。

0

数値は#defineと非常に似ています。利点の1つは、コードを読みやすくすることです。コード全体にマジックナンバーが広がっているのではなく、ナンバーの名前を付ける方が良いでしょう。

コンパイラでは、操作中に名前を関連付けられた番号に置き換えます。固定された数による「自動インクリメント」にはそのようなオプションはありません

、あなたはこのアプローチに従うことができます:あなたの列挙型の値が頻繁に変更される場合

#define INCREMENT_ENUM_BY_NUM 4 

typedef enum { 
    VAL_A = 0 + INCREMENT_ENUM_BY_NUM, 
    VAL_B = VAL_A + INCREMENT_ENUM_BY_NUM, 
    VAL_C = VAL_B + INCREMENT_ENUM_BY_NUM, 
}ENUM_X; 

これは便利です。しかし、#ifdefの2番目の部分と同様に、毎回コードを変更する必要があるため、これは実現不可能です。

お客様の要件に応じていくつかの列挙型が変更されたケースがありました。だから、それらの列挙型を変更し、ビルドして配信します。そこに、このapporachは有用だった。 は、しかし、一般的に、これは良いです - ここ

typedef enum { 
    VAL_A = 4, 
    VAL_B = 8, 
    VAL_C = 12 
}ENUM_X; 
+1

'VALA'または' VALB'が '#ifdef'によって削除された場合、これは動作しません –

+0

@RishikeshRajeはい..答えを更新しました – Swanand

0

は、ソリューションです。これは、3つの列挙型のうちの1つだけが定義されていても機能します。

#define INCREMENT_VALUE 4 
#define VALUE 4 
#define VALTEMP 4 

#define INCR_OPERATION \ 
    #undef VALTEMP \ 
    #define VALTEMP VALUE \ 
    #undef VALUE \ 
    #define VALUE (VALTEMP+ INCREMENT_VALUE) \ 


typedef enum { 
    #ifdef A 
    VAL_A = VALUE, 
    INCR_OPERATION 
    #endif 

    #ifdef B 
    VAL_B = VALUE, 
    INCR_OPERATION 
    #endif 

    #ifdef C 
    VAL_C = VALUE, 
    INCR_OPERATION 
    #endif 

    VAL_END = VALUE 
}ENUM_X;