例:
enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
これはMSVCで機能しますが、非標準ですか?
ありがとう
例:
enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
これはMSVCで機能しますが、非標準ですか?
ありがとう
にenum
は基になる整数型(の値を格納するために使用される型enum
)があり、enum
値はその整数型の値に暗黙的に変換できます。
あなたの場合、基礎となるタイプはint
であり、値は0です。すべて問題ありません。
列挙子リスト内の識別子は、int型の定数として宣言されており、許可されている場合はどこにでも表示できます。
6.7.2.2ここhttp://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
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を選択しましたが、常にではありません。そうでない場合でも、コードはもう少し自己文書化され、明白になります。