ホーム » スタッフ » 斉藤徹 » C++の列挙型を試す

2011年11月
« 10月   12月 »
 12345
6789101112
13141516171819
20212223242526
27282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

C++の列挙型を試す

テスト問題作り中なんだが、列挙型のネタを授業でやってるし、 出題しようかと画策するけど、"g++ -Wall" で警告吐かれるコードは、 基本掲載したくない。んで、C++での列挙型の型チェックの厳しさを 試してみた。

列挙型は、一連の識別可能なタグを自動生成するわけだし、 連番の数字を生成する。しかし、C++ではint型への昇格は認めているけど、 あくまで識別可能なタグ。だから、よく列挙型の紹介で使うコードは、 CではOKだけど、C++ではNG。

enum WEEK { SUN,MON,TUE,WED,THR,FRI,SAT } ;
for( enum WEEK w = SUN ; w <= SAT ; w++ ) {
printf( "%d¥n" , w ) ;
}

"WEEK::operator++() が見つからない"らしい。ま、予想の範囲。

整数値との変換は、昇格を認めているから、以下はC++でもOKなのか。

char week_name[][ 4 ] = {
"Sun","Mon","Tue","Wed","The","Fri","Sat"
} ;
printf( "%s" , week_name[ WED ] ) ; // OK。

うーむ、最初の for() みたいなの書きたい場合は、キャスト無しだと、 どう書くのがC++らしいのかな…

// 美しくない...
w = (enum WEEK)( (int)w + 1 ) ;

switch-breakの書き方

上記のネタの答えを探していたんだけど、その中で安全なコードの書き方なんだろうけど、 以下のようなコードの書き方を見つけた。 switch-case での break 書き忘れによる、処理の通りぬけを防ぐ目的なんだけど、 やっぱり気味悪いなぁ…

switch( x ) {
break ; case 1 : // 処理1
break ; case 2 : // 処理2
break ; default : // 処理default
}

有名な安全なコードの書き方の例として、if文の条件式中の"="と"=="の書き間違い を防ぐために、以下のように書くのも、個人的には気味悪くて嫌い。

// "=="を"="と書き間違えても、コンパイラは警告しない
if ( x == 0 ) 処理... ;
// もし"="に書き間違えたら、定数に代入はできないから警告!!
if ( 0 == x ) 処理... ;