■/*何もしない*/と書くだけでは駄目
#include <stdio.h>
typedef enum {
犬=1,猿,雉,
桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
const char *ret = "" ;
switch(x){
case 犬: ret = "ワンワン"; break;
case 猿: ret = "ウッキー"; break;
case 雉: ret = "ケーン"; break;
default :
;/*何もしない*/
}
return ret;
}
int main(void){
puts(鳴き声(犬));
puts(鳴き声(猿));
puts(鳴き声(雉));
puts(鳴き声(鬼));
puts(鳴き声(桃太郎));
}
/*何もしない*/とか
/*Do nothing*/では
正常経路か
異常経路か
よくわからないので
せっかくコメントを書いても
あまり役に立ちません。
このコードの場合、鬼や桃太郎が来るのは
正常経路でしょうか?
異常経路でしょうか?
■default節が正常経路の場合の作法
#include <stdio.h>
typedef enum {
犬=1,猿,雉,
桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
const char *ret = "" ;
switch(x){
case 犬: ret = "ワンワン"; break;
case 猿: ret = "ウッキー"; break;
case 雉: ret = "ケーン"; break;
default :
;//ここにも制御が来るが、何もせず下へ行く
}
return ret;
}
int main(void){
puts(鳴き声(犬));
puts(鳴き声(猿));
puts(鳴き声(雉));
puts(鳴き声(鬼));
puts(鳴き声(桃太郎));
}
制御が来る事を明示するコメントを記述して下さい。
■default節が異常経路の場合の作法
#include <stdio.h>
#include <assert.h>
typedef enum {
犬=1,猿,雉,
桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
const char *ret = "" ;
switch(x){
case 犬: ret = "ワンワン"; break;
case 猿: ret = "ウッキー"; break;
case 雉: ret = "ケーン"; break;
default :
assert(!"ここには制御は来ない、来たらBUG");
}
return ret;
}
int main(void){
puts(鳴き声(犬));
puts(鳴き声(猿));
puts(鳴き声(雉));
puts(鳴き声(鬼));
puts(鳴き声(桃太郎));
}
制御が来ない事を明示するコメントや
assert()を追加して下さい。
試験でプログラムに問題がある時,
assert()は即時に異常終了してくれるので
問題をみつけやすいです。
出荷時は
gcc -DNDEBUG のようにコンパイルし
assert()を無効化しますが
そうすると
出荷後の問題は見つけれないので
悩ましいです。
製品の種類に応じて
assert()ではなくて
ログを取る独自処理等も検討してください。
参考: