1

例:

enum SomeEnum
{
   DD,
   PP,
   NN
};

void someFunc(int a)
{
}

int main()
{
  SomeEnum e = DD;
   someFunc(a) // calls someFunc with value 0
  return 0;
}

これはMSVCで機能しますが、非標準ですか?

ありがとう

4

3 に答える 3

7

enumは基になる整数型(の値を格納するために使用される型enum)があり、enum値はその整数型の値に暗黙的に変換できます。

あなたの場合、基礎となるタイプはintであり、値は0です。すべて問題ありません。

于 2012-05-17T23:28:25.120 に答える
0

列挙子リスト内の識別子は、int型の定数として宣言されており、許可されている場合はどこにでも表示できます。

6.7.2.2ここhttp://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

于 2012-05-17T23:38:03.100 に答える
0

GManNickGとtomatoが言ったように、すべての列挙型はint型であるため(実際、Cでは列挙型はint型であり、列挙型のスコープ外の値を割り当てることができるため、これは絶対に有効です。

typedef enum _foo
{
   val1 = 57
} foo;
...
foo f = 99; // compiles in C but not C++

実際、列挙型は0、-1、200などの定数整数値として機能するため、ほとんどのコンパイラは、関数の引数の型がbool、float、またはその他のプリミティブな数値型であるかどうかについて文句を言いません。

ただし、someFuncの署名を制御でき、C ++で無効な値が渡されないようにする場合は、次のように変更します。

void someFunc(SomeEnum a);

より多くの型安全性のために

また、少なくとも最初の列挙値は常に初期化してください。私はこれについて間違っているかもしれませんが、当時、コンパイラは列挙型の任意の開始値を選択することが許可されていました。ほとんどの場合、0を選択しましたが、常にではありません。そうでない場合でも、コードはもう少し自己文書化され、明白になります。

于 2012-05-18T00:32:50.563 に答える