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 ) 処理... ;