お世話になります。VS2005 C++を作成しています。
enumについて質問があります。以下のようなenumおよび
コードを定義します
enum Test{
AAA =0,
BBB =1
};
void hoge( int para )
{
if( para == AAA ) // i )
printf(AAAです);
else if( para == BBB ) // ii )
printf(BBBです);
}
void main()
{
hoge(AAA); // enumの型でint引数の関数へ
}
上記の場合 以下の質問があります。
ア)仮引数がint型のもの enumの型で渡すのことは安全なのでしょうか?キャストす
るべきですか?
イ)i) ,ii)のように int型 と enum型 の比較は安全なのでしょうか?保証されな
いなどありますでしょうか?
上記のコードは正常に動作しif文もきちんと判別しています。
私は enumの型の変数 = int型の変数 という認識ですが疑問になり質問させていた
だきました。ご教授よろしくお願いします
すいません。タイトルがおかしいですね。
”enum型の変数とint型の変数比較について”
です 。ご迷惑おかけしました<(_ _)>
> ア)仮引数がint型のもの enumの型で渡すのことは安全なのでしょうか?キャストす
> るべきですか?
それぞれのenum型,およびint型はすべて異なる型です。
つまり,オーバーロード可能ということになります。
なので,int型の引数にenum型の値を渡すことは予期せぬ動作の原因になり得ます。
よって,キャストすべきです。
> イ)i) ,ii)のように int型 と enum型 の比較は安全なのでしょうか?保証されな
> いなどありますでしょうか?
整数型と列挙型の間で比較を行う場合,標準変換により列挙型が整数型に変換されるた
め,
その整数型の値と,列挙型の値を明示的に整数型にキャストした値との間の比較と同等の
比較結果は保証されます。
# これを安全と言うかどうかは安全の定義次第。
この場合は以下のようにできます。
:
void hoge( Test para )
:
enumのTest型を引数としてしまえば、
キャストする必要もなくなります。
また、VCではどのように設定するかはわかりませんが、
UNIX系のコンパイラ(gccなど)では、
-Wswitch-enumというコンパイラオプションをつけると
> if( para == AAA ) // i )
> printf(AAAです);
> else if( para == BBB ) // ii )
> printf(BBBです);
を
:
switch (para) {
cast AAA:
printf(AAAです);
break;
:
のようにswitch文にしたときに、
すべてのenumにたいしてcase文を書かないと
ワーニングが出るようになり、
プログラムミスが軽減できるかもしれません。
YuOさん。シュウさん。ありがとうございます
>よって,キャストすべきです。
ありがとうございます。今まで特に意識していなかったのですが enumとintを同じ型
と考えていたことがよろしくなかったみたいですね。
>すべてのenumにたいしてcase文を書かないとワーニングが出るようになり、
私はUNIXはほとんど触ったことがありませんが、そのオプションは便利ですね。
VC2005でも設定できるんでしょうかね?調査してみます。
いろいろとありがとうございました。また何かありましたらよろしくお願いします