web-dev-qa-db-ja.com

C / C ++負の値の列挙を作成します。番号を付ける必要はありません。

たとえば、C/C++では、次のコードを使用します。

typedef enum fruits{
   Apple,
   banana,
   lemon,
   orange
} fruit_t;

これは次と同等です:

typedef enum fruits{
   Apple = 0,
   banana = 1,
   lemon = 2,
   orange = 3
} fruit_t;

ただし、値を負にしたいので、他の値と競合しません。私はこのようにすることができます:

typedef enum fruits{
   Apple = -1,
   banana = -2,
   lemon = -3,
   orange = -4
} fruit_t;

しかし、別の果物を追加したい場合は、別の値を割り当てる必要があり、その間に値を入れた場合は、そのほとんどの番号を付け直す必要があります。これを行う簡単な方法はありますか?

24
Joe

次のようにINT_MINから始めます。

#include <limits.h>

enum fruits
{
  orange = INT_MIN,
  lemon, 
  ...
}

C11標準の「5.2.4.2.1整数型のサイズ」および/または「Annex E/1 "ごとに、INT_MINは少なくとも-32767

INT_MINは、<limits.h>を含めることで定義されます。

30
alk

[〜#〜] c [〜#〜]では、最初の番号を付けるだけで、後続のエントリは前のエントリになります+1、これは C99ドラフト標準 セクションでカバーされています6.7.2.2列挙指定子emphasis mine):

[...] =を使用した列挙子は、列挙定数を定数式の値として定義します。最初の列挙子に=がない場合、その列挙定数の値は0です。 =なしの後続の各列挙子は、列挙定数を、1 に前の列挙定数の値。[...]

表現は C++ドラフト標準 セクションで類似しています7.2列挙宣言段落2

したがって、次のようなことを行ってください。

#define MIN -4

typedef enum fruits{
   orange = MIN,
   lemon,  
   banana,
   Apple,
} fruit_t;
16
Shafik Yaghmour

上部にニュースを追加します。あなたはまだ一番上のものに番号を付ける必要があります。

enum fruit
{
   orange = -4,
   lemon,
   banana,
   Apple,
};
8
Chad

まず第一に、「C/C++」というものはありません。これらは2つの異なる言語です。 CをC++のサブセットとして見ることはできません。一部の正当なCコードはC++プログラムとしてコンパイルされません。

C++ 11を使用できる場合は、enum classを使用することをお勧めします。これにより、強く型付けされた列挙が得られます。

enum class Traffic {red , yellow, green};
Traffic t = Traffic::red;

if ( t == Traffic::red )  // to test the value of an enum 

この方法では、整数または別の列挙型の変数との比較がコンパイラーで許可されないため、衝突がないことが保証されます。

同じ列挙型の変数と比較するか、例のようにバイナリスコープ解決演算子を使用することしかできません。

このenum classのもう1つの利点は、列挙型のサイズを設定できることです。次のような任意の符号付きまたは符号なし整数型を使用できます。

enum class Traffic : char { red, yellow, green }

タイプが指定されていない場合、デフォルトのintが想定されます。

これには、C++ 11をサポートするコンパイラが必要です。

とにかく好きなように注文できると思います。

値を指定しない場合、次のenumは以前の値の+1を取得します。こぶしenumにも値がない場合、0から始まります。

ただし、正しい順序で実行することをお勧めします。

4
Digital_Reality

エラーを通常の列挙として宣言し、次のように負の値を使用することもよくあります。

typedef enum fruits_e {
    Apple=1,
    BANANA,
    LEMON,
    ORANGE
} fruit_t;

fruit_t eat_fastfood(void) {
    if (! me->healthy())
        return -Apple;
}
0