4

いくつかの古いコードのレビューを行っているときに、enum を使用した次の 2 つの奇妙な構造に気付きました (2 つの異なるファイル/クラス/名前空間をここにまとめただけです)。

enum FirstEnum
   {
    A_CHOICE
   ,ANOTHER_CHOICE=1
   ,YET_SOME_OTHER_CHOICE
   };

enum SecondEnum
   {
    FIRST_CHOICE
   ,SECOND_CHOICE
   ,THIRD_CHOICE
   ,DEFAULT_CHOICE=SECOND_CHOICE
   };

どちらの構造も間違っていると思います。

最初のものは、選択肢の 1 つに値を割り当てますが、他の選択肢には割り当てません。つまり、新しい選択肢が追加されると、問題が発生する可能性があります。

2 番目のケースでは、2 つの列挙要素が同じ基になる値を持つことになります。

C++ 標準が両方の構造を許可する理由はありますか?

(Visual Studio 2010 を使用)

4

4 に答える 4

5

最初のものは、選択肢の 1 つに値を割り当てますが、他の選択肢には割り当てません。つまり、新しい選択肢が追加されると、問題が発生する可能性があります。

「間違える」の意味がわかりません。列挙子の値を指定しない場合、その値は前の値よりも 1 大きい (最初の場合は 0) と明確に定義されています。

2 番目のケースでは、2 つの列挙要素が同じ基になる値を持つことになります。

はい。列挙が一意の値のセットであると想定されていたが、(C++ では)そうでない場合、それは間違っています。

C++ 標準が両方の構造を許可する理由はありますか?

C++ では、列挙は、関連する名前付きの定数値のセットを宣言する方法にすぎないためです。取り得る値を制限しようとはしません。

于 2013-07-17T12:03:30.620 に答える
1

標準からの引用はありませんが、列挙型は、初期化されていない値がその前の値よりも 1 大きい値を取るように指定されています。

したがって、FirstEnum では、YET_SOME_OTHER_CHOICE は 2 (ANOTHER_CHOICE+1) になります。列挙型内に複数の同等の値を持つことも完全に合法です。

于 2013-07-17T12:02:56.590 に答える
1

最初のものは、選択肢の 1 つに値を割り当てますが、他の選択肢には割り当てません。つまり、新しい選択肢が追加されると、問題が発生する可能性があります。

何が問題になる可能性がありますか?確かに、誰かが最初の例を

enum FirstEnum
   {
    A_CHOICE              //0
   ,A_THIRD_CHOICE        //1
   ,ANOTHER_CHOICE=1      //1
   ,YET_SOME_OTHER_CHOICE //2
   };

はい、列挙型で2つの値が同じであると予想していなかった場合、問題が発生します。誰かが#defineこれらの値を持っていて、誤って 2 つの値を同じにしてしまった場合も同様です。

2 番目の例では、列挙型の値の名前が、それがなぜ役立つのかについてのヒントを与えてくれます。タイプの変数のデフォルト値をSecondEnumの定義に格納して、次のSecondEnumようなことができるようにすることができます。

SecondEnum var = DEFAULT_CHOICE;

#define列挙型定義に密接に結合されているが、その一部ではない s または定数は必要ありません。

C++ 標準が両方の構造を許可する理由はありますか?

私は標準化委員会のメンバーではありませんが、推測するに、どちらの構造もプログラマーにとって有用だからです。

于 2013-07-17T12:06:05.170 に答える